我有以下数据(实际上有大约1M行)
foo qux 0 x,y
bar twe 1 a,b,c
foo qux 2 x,y,z
我想要做的是按第一个字段对其进行排序 并且当有一个领带选择具有第三个字段的最高值的那个。 产量:
bar twe 1 a,b,c
foo qux 2 x,y,z
但为什么这段代码不起作用?
sort -k1,1 -k2,2 -k3,3nr datafile.txt |
awk '$3 != x {print} {x = $3}'
# The last awk line attempts to pick top from tie
这样做的正确方法是什么?
答案 0 :(得分:4)
您的命令接近正确,但您需要暂停$1
,而不是$3
。此外,您的陈述是您需要对第一个字段和第三个字段进行排序,但代码依次排序,然后是第二个字段,然后是第三个字段。
名义上,你需要:
sort -k1,1 -k3,3nr datafile.txt | awk '$1 != x { print } { x = $1 }'
如果你需要打破第一和第二个字段(并对它们进行排序),那么:
sort -k1,1 -k2,2 -k3,3nr datafile.txt |
awk '$1 != x || $2 != y { print } { x = $1; y = $2; }'
答案 1 :(得分:0)
sort -k1,1rn <your_file>|awk '{a[$1]=$0;}END{for(i in a)print a[i]}'