我有一个类似的文件:
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
我做错了什么?
答案 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所提到的,更改awk
和sort
的顺序更有效:
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