用awk计算,求和并打印总值

时间:2014-12-03 14:08:31

标签: awk

我想知道如何根据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

我正在寻找你的建议!

1 个答案:

答案 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。我将其更改为始终使用FSOFS。此外,第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