2016-11-16 68 views
0

我有下面的场景,我们有4个记录和使用awk我得到正确的数据,但我无法理解awk如何在这里工作,每个a的含义是什么[] 这里。有人能简单地在awk命令下面解释一下吗?特别是“如果”部分。使用AWK汇总和解除归一化数据

$ cat temp.dat 
abc|v1 
abc|v2 
def|v1 
def|v3 

$ awk -F"|" '{if(a[$1]){a[$1]=a[$1]","$2} else { a[$1]=$2}} END {for (i in a) {print i"|"a[i]}}' temp.dat 
def|v1,v3 
abc|v1,v2 
+1

主要就意味着你复制的人谁不明白awk的语法或语义否则他们永远不会写了一个车,脆弱,冗余代码。阅读Arnold Robbins编写的“有效的Awk编程”第4版。 –

回答

1

的这些问题趋于下降,作为题外话,因为不属于本网站的范围,但让我来帮你了解它,因为你是相对较新的站点。

该命令的击穿(字面意思): -

  • -F"|"是设定输入场分离器,即,让awk知道对解限制器从解析的话,在这种情况下是|awk在输入文件的每一行上运行命令。
  • awk阵列(a[])中,如果条件检查是否存在对于下标$1,即解析它检查是否值a[abc]存在第一线时,阵列中的值。由于它不是可能存在,else从句存储的$2在数组变量(v1)的值,即a[abc]=v1
  • 论解析下一行(abc|v2),因为现在在a[abc]该值存在的if-子句是执行。 a[$1]=a[$1]","$2字面意思是,与已经存在的值(v1),逗号(,)和$2a[abc]当前值改写在a[abc]值现在有v1,v2
  • 上述两个步骤同样发生用于下一组线,其存储a[def]=v1,v3

现在,阵列被填满,的awkEND子句满足。通过一般逻辑,一旦awk已经在线解析文件并且对其进行了一些修改,就执行该子句中的语句。

就你而言,END{}语句只是打印数组的内容。

  • for (i in a)装置,用于每个阵列即i in (abc,def)
  • print i"|"a[i]}中的下标打印i(abc,def)的值和索引的从阵列即a[abc] and a[def]|在中间的值。

了解更多关于awkin-this-tutorial

+1

wrt'它检查值a [abc]是否存在 - 不 - 不,它不。 'if(a [abc])'检查数组元素'a [abc]'的值是否不为零也不为零。如果你想检查一个值'a [abc]',那么测试就是'if(abc in a)',这是一个非常不同的测试,并且我怀疑编写代码的人真正想写什么。 –