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)
什么是正确的方法呢?
你的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)