2016-09-23 43 views
-3

我有一個文件,其中包含我想從字符串末尾開始排序的文件路徑和文件名。bash排序從每行的末尾開始的列表

我的文件中包含一個列表,如下面:

/Volumes/Location/Workers/Andrew/2015-08-12_Andrew_PC/DOCS/3177109.doc 
/Volumes/Location/Workers/Andrew/2015-09-17_Andrew_PC/DOCS/2130419.doc 
/Volumes/Location/Workers/Bill/2016-03-17_Bill_PC/DOCS/1998816.doc 
/Volumes/Location/Workers/Charlie/2016-07-06_Charlie_PC/DOCS/4744123.doc 

我要對此列表進行排序,使得文件名會是連續的,這將有助於找到基於文件名,無論路徑的副本。

名單應該會出現這樣的:

/Volumes/Location/Workers/Bill/2016-03-17_Bill_PC/DOCS/1998816.doc 
/Volumes/Location/Workers/Andrew/2015-09-17_Andrew_PC/DOCS/2130419.doc 
/Volumes/Location/Workers/Andrew/2015-08-12_Andrew_PC/DOCS/3177109.doc 
/Volumes/Location/Workers/Charlie/2015-07-06_Charlie_PC/DOCS/4744128.doc 
+1

你有沒有嘗試什麼嗎? – Inian

+0

如果您的最終目標是查找重複項,則無需排序即可完成 – Sundeep

+0

通過爲每個項生成MD5校驗和並通過'sort | uniq -d「查找重複的內容,無論文件名是什麼。 –

回答

2

這裏有一個辦法做到這一點:

sed -e 's|^.*/\(.*\)$|\1\t\0|' list.txt | sort | cut -f 2- 

這使用sed插入文件名的副本到每一行的開頭,這樣我們可以sort列表進行排序。然後我們刪除我們在第一步添加的東西。

+2

沒有不敬,但你爲什麼不回答問題而沒有驗證作者的嘗試?它只是基本上提供免費代碼。 – Inian

+0

工作就像一個魅力!非常感謝! – QuePID

+1

@Inian:無論OP投入多少努力,我們都免費提供免費代碼和建議。至少,我不記得甚至在提交人發佈他的企圖時也沒有收到過報酬。 –

1

這將整理在此基礎上由/分離動態最後一個字段。 首先它會將最後一個字段追加到行首,然後sort。先前附加的第一個字段被第二個awk刪除。

awk -F'/' '{ $0= $NF " " $0;print $0 |"sort -k1"}' fil |awk '{print $2}' 
/Volumes/Location/Workers/Bill/2016-03-17_Bill_PC/DOCS/1998816.doc 
/Volumes/Location/Workers/Andrew/2015-09-17_Andrew_PC/DOCS/2130419.doc 
/Volumes/Location/Workers/Andrew/2015-08-12_Andrew_PC/DOCS/3177109.doc 
/Volumes/Location/Workers/Charlie/2016-07-06_Charlie_PC/DOCS/4744123.doc 
1

這應該工作:

sort -t/ -k7 input_file 
+1

只有所有路徑具有相同的段數。如果碰到'/ Volumes/Location/Jim/2016-09-23_Jim_PC/DOCS/Personal/1234.doc',那將會失敗。它適用於OP公佈的樣本數據,但這不是一個好的通用解決方案。 –

+0

@JimMischel:OP沒有要求一個通用的解決方案。我更願意遵循[KISS原則](https://en.wikipedia.org/wiki/KISS_principle)。 – mouviciel