我想知道如何根据First($1) and Second Field ($2)
组合计算订单项,汇总商品并最终打印总计。
我目前能够执行以下步骤。
Input.csv
mmmm,aa123aa,11,www
pppp,bb456bb,40,www
mmmm,aa123aa,33,www
pppp,bb456bb,20,www
xxxx,cc789cc,88,www
mmmm,aa123aa,22,www
pppp,bb456bb,60,www
mmmm,aa123aa,44,www
xxxx,cc789cc,88,www
步骤1:
awk -F, '{key=$1","$2;++a[key];b[key]=b[key]+$3} END {for(i in a) print i","a[i]","b[i]}' Input.csv >Op11_Input.csv
输出#1:
Op11_Input.csv
xxxx,cc789cc,2,176
mmmm,aa123aa,4,110
pppp,bb456bb,3,120
步骤2:
awk 'BEGIN{FS=OFS=","}; {for(i=1;i<=NF;i++) $i=(a[i]+=$i)} END {print}' Op11_Input.csv
输出#2:
0,0,9,406
是否有最简单的方法,例如单线程命令,以避免step2?
期望的输出:
xxxx,cc789cc,2,176
mmmm,aa123aa,4,110
pppp,bb456bb,3,120
0,0,9,406
我正在寻找你的建议!
答案 0 :(得分:2)
你可以说:
awk 'BEGIN{FS=OFS=","}
{key=$1 FS $2; ++a[key]; b[key]+=$3}
END {
for(i in a) {print i, a[i], b[i]
tot+=a[i]; stot+=b[i]}
print tot, stot}' file
请注意,您使用,
以及定义FS
。我将其更改为始终使用FS
和OFS
。此外,第1和第2个字段的添加没有意义(它输出0
)所以我只是跳过它。
作为一个班轮:
$ awk 'BEGIN{FS=OFS=","} {key=$1 FS $2; ++a[key]; b[key]+=$3} END {for(i in a) {print i, a[i], b[i]; tot+=a[i]; stot+=b[i]} print tot, stot}' file
xxxx,cc789cc,2,176
mmmm,aa123aa,4,110
pppp,bb456bb,3,120
9,406
更短(thanks Jidder):
awk 'BEGIN {FS=OFS=","}
{key=$1 FS $2;a[key]++;b[key]+=$3;c+=$3}
END{for(i in a)print i, a[i], b[i]; print 0, 0, NR,c}' file