我有以下情况,我们有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
答案 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