2013-06-27 49 views
0

我有匹配名稱模式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 
+0

使用'sort'對列表進行排序,並'awk'每A. – Barmar

回答

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排列。使用sortuniq

+1

真棒選擇一條線!輝煌的解決方案。正是我在找什麼。謝謝 –

3

一種方法是

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。請注意,你可以進一步減少這個'sort -k1,1n -k2,2nr -t- | uniq -w6' – iruvar