汇总列和计数行

OXX*_*XXO 0 awk

我正在尝试对第2列中的某些数字求和,它与我的代码兼容。但是我也想计算在第2列中相同值重复多少次并在最后一栏中打印。

文件1

36  2605 1 2
36  2605 1 2
36  2603 1 2
36  2605 1 2
36  2605 1 2
36  2605 1 2
36  2606 1 2
Run Code Online (Sandbox Code Playgroud)

期望的输出

2603  36 1  2 1
2605 180 5 10 5
2606  36 1  2 1
Run Code Online (Sandbox Code Playgroud)

我试过了

awk '{a[$2]+=$1}{b[$2]+=$3}{c[$2]+=$4;count[$2]+=$2}END{for(i in a)print i,a[i],b[i],c[i],count[i]}' file1
Run Code Online (Sandbox Code Playgroud)

提前致谢

Jam*_*own 5

重命名了vars并添加了漂亮的打印效果:

awk '
{
    sum1[$2]+=$1
    sum3[$2]+=$3
    sum4[$2]+=$4
    count[$2]++

    len2=((l=length($2))>len2?l:len2)        
    len1=((l=length(sum1[$2]))>len1?l:len1)
    len3=((l=length(sum3[$2]))>len3?l:len3)
    len4=((l=length(sum4[$2]))>len4?l:len4)
    len5=((l=length(sum5[$2]))>len5?l:len5)
}
END {
    for(i in count) {
        printf "%*d %*d %*d %*d %*d\n",
            len2,i,len1,sum1[i],len3,sum3[i],len4,sum4[i],len5,count[i]
    }
}' file
Run Code Online (Sandbox Code Playgroud)

输出:

2603  36 1  2 1
2605 180 5 10 5
2606  36 1  2 1
Run Code Online (Sandbox Code Playgroud)


Ed *_*ton 5

这些天空间字符相对便宜,你真的应该考虑为你的代码准备一些,特别是如果你想让其他人阅读它来帮助你调试它!这是您发布的代码:

awk '{a[$2]+=$1}{b[$2]+=$3}{c[$2]+=$4;count[$2]+=$2}END{for(i in a)print i,a[i],b[i],c[i],count[i]}' file1
Run Code Online (Sandbox Code Playgroud)

这是在通过代码美化程序运行之后(我使用过gawk -o):

{
        a[$2] += $1
}

{
        b[$2] += $3
}

{
        c[$2] += $4
        count[$2] += $2
}

END {
        for (i in a) {
                print i, a[i], b[i], c[i], count[i]
        }
}
Run Code Online (Sandbox Code Playgroud)

看看如何通过添加一些空白现在更容易理解,因此如何count[$2]填充的错误非常明显?一些有意义的变量名称也总是非常有用,我听说字母数字字符现在很特别!

FWIW 这是我的做法:

$ cat tst.awk
BEGIN { keyFldNr = 2 }
{
    numOutFlds = 0
    for (i=1; i<=NF; i++) {
        if (i != keyFldNr) {
            sum[$keyFldNr,++numOutFlds] += $i
        }
    }
    cnt[$keyFldNr]++
}
END {
    for (key in cnt) {
        printf "%s%s", key, OFS
        for (i=1; i<=numOutFlds; i++) {
            printf "%s%s", sum[key,i], OFS
        }
        print cnt[key]
    }
}

$ awk -f tst.awk file
2603 36 1 2 1
2605 180 5 10 5
2606 36 1 2 1

$ awk -f tst.awk file | column -t
2603  36   1  2   1
2605  180  5  10  5
2606  36   1  2   1
Run Code Online (Sandbox Code Playgroud)

请注意,无论您在每一行上有多少个字段,它都会按原样工作,并且如果您需要为要计数和求和的键使用不同的字段,那么您只需更改 BEGIN 部​​分中 keyFldNr 的值即可2 随心所欲。