【问题标题】:count, sum and print total values with awk使用 awk 计算、求和并打印总值
【发布时间】:2014-12-03 14:08:31
【问题描述】:

我想知道如何根据First($1) and Second Field ($2) 组合计算行项目数、汇总项目数并最终打印总数。

我目前能够执行以下步骤。

输入.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

我正在寻找您的建议!

【问题讨论】:

    标签: awk


    【解决方案1】:

    你可以说:

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

    【讨论】:

    • 感谢 Fedorqui,我添加了第一个和第二个输出 0 的字段以保持格式不变,在将输出转换和分析为 Excel 时,它将设置在正确的字段位置!!!
    • 非常感谢 Fedorqui 的快速响应,已接受并投票赞成答案!!!
    • 你不能只打印NR 而不是stot 吗?即awk -F, '{key=$1 FS $2;a[key]++;b[key]+=$3;c+=$3} END{for(i in a)print i","a[i]","b[i];print NR","c}'
    • @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 很好,很好。也用这个版本编辑过,谢谢!
    • @AVN NR 指记录数。所以第一行是1,第二行是2,依此类推......因此,它包含了END块中最后一行的编号,因此可以用来显示编号文件包含的行数。
    猜你喜欢
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    相关资源
    最近更新 更多