使用AWK汇总和反规范化数据

时间:2016-11-16 09:41:10

标签: bash shell unix awk sed

我有以下情况,我们有4条记录并使用awk我按预期获得了正确的数据,但我无法理解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 个答案:

答案 0 :(得分:1)

由于不属于本网站的范围,这些类型的问题往往会偏离主题,但让我帮助您理解它,因为您对该网站相对较新。

命令的细分(字面意思): -

  • -F"|"用于设置输入字段分隔符,即让awk知道去除限制器以解析来自的单词,在这种情况下为|awk在输入文件的每一行上运行命令。
  • awk数组(a[])中,if-condition检查数组中是否有值为下标$1,即在解析第一行时检查是否为值{ {1}}存在。由于它不太可能存在,因此else子句将a[abc]的值存储在数组变量($2)中,即v1
  • 在解析下一行(a[abc]=v1)时,从现在abc|v2中的值存在,执行if子句。 a[abc]字面意思是,用已存在的值(a[$1]=a[$1]","$2),逗号(a[abc])和v1的当前值,覆盖$2中的值,即a[abc] 1}}现在有v1,v2
  • 对于存储a[def]=v1,v3
  • 的下一组行,上述两个步骤相同

现在数组已填满,END的{​​{1}}子句已满足。通过一般逻辑,只要awk在线解析文件并对其进行一些修改,就会执行此子句中的语句。

在你的情况下,awk语句只是打印数组的内容。

  • END{}表示数组中的每个下标,即for (i in a)
  • i in (abc,def)打印print i"|"a[i]} i的值,以及数组中索引的值,即(abc,def),其中a[abc] and a[def]位于中间。

详细了解| in-this-tutorial