我的AWK脚本正确吗?

时间:2018-06-19 23:26:08

标签: awk

我有一个包含一些列的文件。我写了一个小awk来根据文件的第一,第二和第三列汇总(汇总)列。

以下是数据示例:

Cairo, Summer, Building#A, 34, 45, 66, 97
Cairo, Summer, Building#B, 21, 2, 2, 0.9
Cairo, Summer, Building#C, 23, 11, 2, 12
NYC, Summer, Unit#5,       22, 34, 23, 1
NYC, Winter, Apt#45,       32, 42, 33, 20

这是我正在使用的脚本:

awk -F, '{gsub("%", ""); \
a[$1","$2","$3]+=$4;b[$1","$2","$3]+=$5;c[$1","$2","$3]+=$6;d[$1","$2","$3]+=$7}
END{for(i in a) if(a[i]+b[i]+c[i]+d[i] > 0) print i","a[i]","b[i]","c[i]","d[i]}'
input_file > output_file

它给了我结果。

问题是:这是正确的方法吗?如果是这样,那么此存储空间和速度是否足够好?如果没有,那么是否有人愿意提出更好的选择? :-)谢谢。

1 个答案:

答案 0 :(得分:2)

我会这样写

$ awk 'BEGIN {FS=OFS=","} 
             {for(i=4;i<=NF;i++) 
                {k=$1 FS $2 FS $3; ks[k]; a[k,i]+=$i}} 
       END   {for(k in ks) 
                {printf "%s", k; 
                 for(i=4;i<=NF;i++) printf "%s", OFS a[k,i]; print ""}}' file

效率不高,但采用 DRY 原则,密钥定义在一个位置,使用FS / OFS代替硬编码的字符串,使用loop和NF代替固定字段的数量,以防出现printf需要格式化等。

请注意,由于键都是唯一的,因此对于给定的输入数据,不会发生聚合。