排序并选择具有最大值的行

时间:2013-06-27 11:10:44

标签: shell unix

我的目录中包含与名称模式A-B.diff匹配的文件,其中AB是数字,例如:

100885-40843.diff
100885-41535.diff
100886-40500.diff
101036-41762.diff
101036-42346.diff
101038-42010.diff
101038-42127.diff
101038-43258.diff
101038-43873.diff

我想获得符合以下条件的这些文件的列表:

  • A只有一个文件
  • B具有给定A
  • 的最大值

因此,对于给定的文件,列表应为:

100885-41535.diff
100886-40500.diff
101036-42346.diff
101038-43873.diff

2 个答案:

答案 0 :(得分:3)

使用sortuniq的一种方式是

sort -t- -r -k2 | sort -t- -rs | uniq -w6

-t-将分隔符设置为减号,-k2选择要排序的第二列,-r从最大到最小排序,-s强制排序要稳定。然后,uniq -w6uniq相同(从排序列表中选择唯一行),只是它只检查前六个字符。执行此命令后,行按AB排序,对于每个A,第一次出现的行具有最大B,因此uniq选择那条线。在您的输入上,这将显示输出

101038-43873.diff
101036-42346.diff
100886-40500.diff
100885-41535.diff

我想如果您希望列表按自然顺序排列,则可以附加另一个sort -n(按编号排序)。

答案 1 :(得分:1)

如果您将数据存储在文件中,则可以:

$ awk -F"[-.]" '{if ($2 > a[$1]) a[$1]=$2} END{for (i in a) printf "%s-%s.diff\n",i, a[i]}' file
100885-41535.diff
100886-40500.diff
101036-42346.diff
101038-43873.diff

循环创建包含a[1st part] = biggest 2nd part的数组的文件列表。