0

我有一个目录,其中的文件与名称 pattern 匹配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
4

2 回答 2

3

使用sortand的一种方法uniq

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

-t-将分隔符设置为减号,-k2选择要排序的第二列,从大到小排序-r,并-s强制排序稳定。然后,uniq -w6uniq(select unique lines from a sorted list) 相同,只是它只检查前六个字符。执行此命令后,行将按A和按 排序B,并且对于A第一次出现的每个,都有最大值B,因此uniq选择该行。在您的输入中,这将显示输出

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

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

于 2013-06-27T11:33:48.383 回答
1

If you store data in a file, this makes it:

$ 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

Loops through the list of files creating an array with a[1st part] = biggest 2nd part.

于 2013-06-27T11:14:36.183 回答