1

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

正确的方法是什么?

4

2 回答 2

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; }'
于 2013-02-12T07:10:26.120 回答
0
sort -k1,1rn <your_file>|awk '{a[$1]=$0;}END{for(i in a)print a[i]}'
于 2013-02-12T07:25:36.320 回答