2013-04-17 94 views
0

我試圖根據文件名中附加的'日期字符串'對文件進行排序,例如文件如下 SSA_F12_05122013.request.done SSA_F13_12142012.request.done SSA_F14_01062013.request.done 其中05122013,12142012和01062013代表格式中的日期。 請幫助我提供一個unix shell腳本來對它們的文件名中存在的日期字符串(按降序和升序排列)上的這些文件進行排序。Unix shell腳本根據其文件名中存在的'日期字符串'對文件進行排序

在此先感謝。使用awk和排序

+0

當你試圖自己做這件事時,你被卡住了哪一部分? – Johnsyweb

+0

約翰,我是這個平臺的初學者,不知道如何做到這一點。我嘗試使用排序命令,但無法取得文件名(其中包含日期)的一部分,並根據該文件進行排序。請幫我解決這個問題。 –

+1

找到命名模式的負責人,並在背後踢他,以免讓圖案輕易排序。然後找出你是否無法改變模式。 YYYY-MM-DD不僅可以排序,而且也很明確。 (如果不是'12142012',我不知道你的例子中哪些數字是「月」,哪些數字是「日」)。 – DevSolar

回答

0

一個辦法:

ls -1|awk -F'[_.]' '{s=gensub(/^([0-9]{4})(.*)/,"\\2\\1","g",$3);print s,$0}'|sort|awk '$0=$NF' 

,如果我們把它分解:

ls -1| 
awk -F'[_.]' '{s=gensub(/^([0-9]{4})(.*)/,"\\2\\1","g",$3);print s,$0}'| 
sort| 
awk '$0=$NF' 

ls -1只是例子。我想你有辦法得到文件列表,每行一個。

測試一點點:

kent$ echo "SSA_F13_12142012.request.done 
SSA_F12_05122013.request.done 
SSA_F14_01062013.request.done"|awk -F'[_.]' '{s=gensub(/^([0-9]{4})(.*)/,"\\2\\1","g",$3);print s,$0}'| 
sort| 
awk '$0=$NF' 
SSA_F13_12142012.request.done 
SSA_F14_01062013.request.done 
SSA_F12_05122013.request.done 
0
ls -lrt *.done | perl -lane '@a=split /_|\./,$F[scalar(@F)-1];$a[2]=~s/(..)(..)(....)/$3$2$1/g;print $a[2]." ".$_' | sort -rn | awk '{$1=""}1' 
+0

你也可以用'awk'{print $ NF} '得到文件名。 – Inductiveload

+0

這真的很有幫助。執行上面的命令,得到錯誤爲 awk:語法錯誤在第1行附近 awk:在第1行附近跳出 我嘗試執行下面的命令,刪除'awk'部分, ls -lrt * .done | perl -lane'@ a = split/_ | \ ./,$ F [scalar(@F)-1]; $ a [2] =〜s /(..)(..)(....)/ $ 3 $ 2 $ 1/g; print $ a [2]。「」。$ _'| sort -rn 它按照預期以排序的方式返回結果。 我不確定我們使用的是awk命令,也沒有理解上面的命令,因爲我有很少的知識:)。 您的回答非常有幫助,上述命令的任何說明都非常感謝。 Tnx很多。 –

0
ls *.done | perl -pe 's/^.*_(..)(..)(....)/$3$2$1$&/' | sort -rn | cut -b9- 

這將做+

+0

非常感謝Sidharth ,,它的工作,但我不能清楚地理解完整的語句:),請簡要說明以上聲明中的每個命令都在做什麼。 –

+0

使用perl替換命令,我們正在以YYYYMMDD格式重新排列日期,並將其附加到文件名的開頭,以便排序將正常運行。排序後,前8個字符被刪除使用剪切-b9-您可以參考[這裏](http://www.cs.tut.fi/~jkorpela/perl/regexp.html)perl正則表達式語法。 –

+0

這是非常有用的,問題解決了,,謝謝很多 –

2

嗯...爲什麼喜歡AWK和Perl權重股打電話的時候sort本身定義的能力究竟到排序方式?

ls SSA_F*.request.done | sort -k 1.13,1.16 -k 1.9,1.10 -k 1.11,1.12 

每個-k選項定義了 「排序關鍵字」:

-k 1.13,1.16 

這定義範圍從場1,列13中的排序鍵字段1,列16(A字段由默認分隔你的文件名沒有。)

如果你的文件名長度不同,將下劃線定義爲字段分隔符(使用-t選項),然後在第三個字段中尋址列將是要走的路。

有關詳細信息,請參閱man sort。使用-r選項按降序排序。

+0

謝謝Dev,你是正確的,但如果我的文件名長度變化,(例如SSA_F12_05122013.request.done和SSA_F9_05122013.request.done),那麼我認爲我們不能繼續處理文件名中的字符位置。是否有解決方案? –

+0

那麼,再次踢負責人之後;-)你可以使用'sort -f'_'-k 3.5,3.8 -k 3.1,3.2 -k 3.3,3.4'。 (使'_'成爲字段分隔符,並且在第三個字段(即日期)中尋址列)警告,未經測試,風險自負(或在測試生產性數據之前先進行測試)。 – DevSolar

+1

太棒了!幫了很多。謝謝。順便說一下,分離它的-t而不是-f。 –

相關問題