如何使用Unix排序从tie-break组中选择最高值

sca*_*der 2 unix linux sorting bash awk

我有以下文本文件:

$ cat myfile.txt
foo,a,10
bar,c,33
foo,b,50
bar,a,9
foo,a,20
bar,b,20
Run Code Online (Sandbox Code Playgroud)

我想要做的是按第二列和第三列(数字下降)排序,最后选择每个第二列组的顶部,导致

foo,a,20
foo,b,50
bar,c,33
Run Code Online (Sandbox Code Playgroud)

我坚持这个:

$ sort -t"," -k2 -k3r   test.txt
foo,a,10
foo,a,20
bar,a,9
bar,b,20
foo,b,50
bar,c,33
Run Code Online (Sandbox Code Playgroud)

什么是正确的方法呢?

mwp*_*mwp 6

你的sort命令很接近.-k实际上需要一系列字段,所以你-k2被解释为"对从第二个字段到行尾的所有内容进行排序",它-k3完全忽略了它.您必须明确范围的开始和结束位置.你还想在数字上排序第三.

这就是所有这些:

$ sort -t, -k2,2 -k3,3nr myfile.txt
foo,a,20
foo,a,10
bar,a,9
foo,b,50
bar,b,20
bar,c,33
Run Code Online (Sandbox Code Playgroud)

现在,您要根据第二个字段选择每个组的第一行.虽然sort能够对流进行重复数据删除,但是处理这样的复杂场景并不够智能.幸运的是,我们有awk:

$ sort -t, -k2,2 -k3,3nr myfile.txt | awk -F, 'x != $2 { print; x = $2 }'
foo,a,20
foo,b,50
bar,c,33
Run Code Online (Sandbox Code Playgroud)