2014-03-26 54 views
0

我想使用Unix的這些文件進行排序命令:的Unix - 排序文件名以一個密鑰,但不知道它的位置

MyFile_fdfdsf_20140326.txt 
MyFile_4fg5d6_20100301.csv 
MyFile_dfgfdklm_19990101.tar.gz 

我等待這裏的結果MyFile_fdfdsf_20140326.txt

所以我d喜歡用最新的日期獲取文件。

我不能使用'sort -k',因爲鍵的位置(日期)可能有所不同 但是在我的文件名中,總是有兩個「_」分隔符和一個點'。'。文件擴展

任何幫助,將不勝感激:)

+0

是始終之後的第二'日期_'? – fedorqui

+0

謝謝你的回答。這是完美的。 但出於好奇,如果我有一個未知數的「\ _」分隔符,但該日期總是在最後一個「\ _」分隔符之後。 MyFile_abc_def _..._ 20140326.txt sort -t'_'-nk ???文件 – user3464809

+0

查看我更新的答案。我介紹了這個具體案例。另外,它解決了你的問題?既然你是新來的,如果你的問題已經解決了,請不要忘記標記答案。您可以點擊答案旁邊的複選標記將其從空心切換爲綠色。如果您有任何疑問,請參閱[幫助中心>提問](http://stackoverflow.com/helpcenter/someone-answers)! – fedorqui

回答

0

然後使用-t指示字段分隔符並將其設置爲_

sort -t'_' -k3 

見排序,如果他們的文件名的例子在一個文件中。我用-n爲數字排序,並-r爲相反的順序:

$ sort -t'_' -nk3 file 
MyFile_dfgfdklm_19990101.tar.gz 
MyFile_4fg5d6_20100301.csv 
MyFile_fdfdsf_20140326.txt 

$ sort -t'_' -rnk3 file 
MyFile_fdfdsf_20140326.txt 
MyFile_4fg5d6_20100301.csv 
MyFile_dfgfdklm_19990101.tar.gz 

man sort

-t,--field分離器SEP =

使用SEP代替非空白到空白轉變

-n,--numeric排序

比較根據字符串數值

-r,--reverse

反轉比較

的結果

更新

謝謝你的回答。這是完美的。但出於好奇,如果 我有一個未知數量的分隔符,但日期總是在最後一個「_」分隔符 之後。 MyFile_abc_def _... 20140326.txt sort -t'' -nk ???文件 - user3464809

你可以欺騙它一點點:打印最後一個字段,排序,然後將其刪除。

awk -F_ '{print $NF, $0}' a | sort | cut -d'_' -f2- 

看到一個例子:

$ cat a 
MyFile_fdfdsf_20140326.txt 
MyFile_4fg5d6_20100301.csv 
MyFile_dfgfdklm_19990101.tar.gz 
MyFile_dfgfdklm_asdf_asdfsadfas_19940101.tar.gz 
MyFile_dfgfdklm_asdf_asdfsadfas_29990101.tar.gz 

$ awk -F_ '{print $NF, $0}' a | sort | cut -d'_' -f2- 
dfgfdklm_asdf_asdfsadfas_19940101.tar.gz 
dfgfdklm_19990101.tar.gz 
4fg5d6_20100301.csv 
fdfdsf_20140326.txt 
dfgfdklm_asdf_asdfsadfas_29990101.tar.gz 
+0

但是OP在說每個文件可能在名稱中有不同位置的日期(儘管他在他的例子中證明了這種可能性做得不好)。 – dg99

+0

顯然這很好,請參閱有關問題的評論。但是謝謝你讓我知道,@ dg99 – fedorqui

相關問題