如何在Unix排序后用awk选择每组相关行的顶行

时间:2013-02-12 06:09:41

标签: unix sorting awk

我有以下数据(实际上有大约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

这样做的正确方法是什么?

2 个答案:

答案 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]}'