linux - 如何使用 Unix 排序从平局决胜组中选取最高值

标签 linux bash sorting unix awk

我有以下文本文件:

$ cat myfile.txt
foo,a,10
bar,c,33
foo,b,50
bar,a,9
foo,a,20
bar,b,20

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

foo,a,20
foo,b,50
bar,c,33

我被这个问题困扰了:

$ sort -t"," -k2 -k3r   test.txt
foo,a,10
foo,a,20
bar,a,9
bar,b,20
foo,b,50
bar,c,33

正确的做法是什么?

最佳答案

您的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

现在您想要根据第二个字段选择每个组的第一行。尽管 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

关于linux - 如何使用 Unix 排序从平局决胜组中选取最高值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47344987/

相关文章:

linux - 将 "broadcast"数据传送到 linux 中的多个进程的规范方法?

linux - 强制 ld 绑定(bind)到未版本化的 .so 文件

bash - Bash 中的 while 循环子 shell 困境

r - 排序包含语义版本的字符向量

phpmyadmin 拒绝所有权限(Arch Linux 设置)

linux - Linux中有没有可以从虚拟地址确定物理地址的API?

linux - 批量文件夹重命名

Bash:路径为\

java - (java)为什么冒泡排序不排序?

algorithm - 快速访问排序子集