我有一个包含一些列的文件。我写了一个小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
它给了我结果。
问题是:这是正确的方法吗?如果是这样,那么此存储空间和速度是否足够好?如果没有,那么是否有人愿意提出更好的选择? :-)谢谢。
答案 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需要格式化等。
请注意,由于键都是唯一的,因此对于给定的输入数据,不会发生聚合。