列出最常见的值及其相应的总和

时间:2014-01-02 22:18:47

标签: bash shell sorting csv awk

我想获得CSV文件中字段的前N个最常见值 他们在另一个领域的总和。我怎么能用awk做到这一点?

假设我的文件是:

v1,45
v3,20
v2,500
v3,100
v2,200
v1,55
v3,50
v1,10

我需要N = 2个最常出现的字段1值及其对应的field2值的总和 在这种情况下输出将是:

v1,110
v3,170

2 个答案:

答案 0 :(得分:1)

 awk -F, '{a[$1]+=$2;c[$1]++}END{for(k in c)print c[k], k","a[k]}' file|sort -nr|awk 'NR<3&&$0=$2'

它可以在一个awk中解决,但这更直截了当。 :)

如果您想更改N,只需修改上一个awk cmd NR<3...

答案 1 :(得分:1)

在Gnu awk中有一个asort函数,所以你可以做

gawk -f a.awk file

其中a.awk是:

BEGIN { FS=OFS="," }
{
    a[$1]++
    b[$1]+=$2
}

END {
    for (i in a)
        a[i]=a[i]"\t"i
    n=asort(a)
    for (i=1; i<=n; i++) {
        split(a[i],c,"\t")
        ind[i]=c[2]
    }
    for (i=n; i>n-2; i--) 
        print ind[i],b[ind[i]]
}

输出:

v3,170
v1,110