我的目录中包含与名称模式A-B.diff
匹配的文件,其中A
和B
是数字,例如:
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
答案 0 :(得分:3)
使用sort
和uniq
的一种方式是
sort -t- -r -k2 | sort -t- -rs | uniq -w6
-t-
将分隔符设置为减号,-k2
选择要排序的第二列,-r
从最大到最小排序,-s
强制排序要稳定。然后,uniq -w6
与uniq
相同(从排序列表中选择唯一行),只是它只检查前六个字符。执行此命令后,行按A
和B
排序,对于每个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
的数组的文件列表。