使用awk计算、求和并打印总值

使用awk计算、求和并打印总值,awk,Awk,我想知道如何根据第一个字段($1)和第二个字段($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)和第二个字段($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步:

输出#1:

Op11_Input.csv

xxxx,cc789cc,2,176
mmmm,aa123aa,4,110
pppp,bb456bb,3,120
第2步:

有没有最简单的方法,例如一行命令,来避免步骤2

期望输出:

xxxx,cc789cc,2,176
mmmm,aa123aa,4,110
pppp,bb456bb,3,120
0,0,9,406
我在寻找你的建议

你可以说:

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
。另外,为第一个和第二个字段添加字段没有意义(它输出
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
更简短的():


感谢Fedorqui,我为第一和第二输出0添加了字段,以保持格式不变,在将输出转换和分析为Excel时,它将设置在正确的字段位置!!!非常感谢Fedorqui的快速响应,已经接受并投票表决了答案!!!你能不能不打印
NR
而直接打印
stot
?例如
awk-F,{key=$1fs$2;a[key]++;b[key]+=$3;c+=$3}END{用于(a中的i)打印i”,“a[i]”,“b[i];print NR”,“c}'
@Jidder<代码>awk'BEGIN{FS=OFS=“,”}{key=$1fs$2;a[key]++;b[key]+=$3;c+=$3}END{对于(a中的i)打印i,a[i],b[i];打印0,0,NR,c}文件很好,这一点很好。也用这个版本编辑,谢谢@AVN
NR
指记录的数量。所以第一行是
1
,第二行是
2
,依此类推。。。因此,它包含
END
块中最后一行的编号,因此可以使用它来显示文件包含的行数。
xxxx,cc789cc,2,176
mmmm,aa123aa,4,110
pppp,bb456bb,3,120
0,0,9,406
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
$ 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
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