使用awk对唯一值求和和排序

时间:2018-04-25 17:44:34

标签: awk

我有一个类似的文件:

A 444
C 333
D 100
B 888
D 200
D 300
A 777
A 1337
B 555
C 666

我需要使用awk从第一列中计算第一列中每个唯一名称的总和。 我用过:

cat ./access3.log | gawk '{{a[$1]+=$2}; for (i in a) print i " - " a[i]}' | sort | sort -rn | head -3

我打算

A 2558
B 1443
C 999

相反,我得到

D - 600
D - 600
D - 600

我做错了什么?

3 个答案:

答案 0 :(得分:1)

你可以这样做:

sort inputfile | awk '{seen[$1]+=$2}END{for (i in seen) print i, seen[i]}'

输出:

A 2558
B 1443
C 999
D 600

正如karakfa所提到的,更改awksort的顺序更有效:

awk '{seen[$1]+=$2}END{for (i in seen) print i, seen[i]}'  inputfile | sort

答案 1 :(得分:1)

作为替代方案 - 单个GNU datamash 命令:

datamash -sW -g1 sum 2 < access3.log

输出:

A   2558
B   1443
C   999
D   600

答案 2 :(得分:0)

使用GNU awk和controlling array scanning order对输出进行排序:

$ awk ' {
    a[$1]+=$2                              # sum and hash to a
} 
END {
    PROCINFO["sorted_in"]="@val_num_desc"  # order is greatest value first
    for(i in a) {                          
        print i, a[i]
        if(++c==3)                         # exit after first three values
            exit
    }
}' file
A 2558
B 1443
C 999