2012-07-18 164 views
3

我有包含數十萬條記錄的文本文件。其中一個字段是日期字段。 是否有任何方法基於日期字段對文件進行排序?unix中的排序日期字段

09-APR-12 04.08.43.632279000 AM 
19-MAR-12 03.53.38.189606000 PM 
19-MAR-12 03.56.27.933365000 PM 
19-MAR-12 04.00.13.387316000 PM 
19-MAR-12 04.04.45.168361000 PM 
19-MAR-12 03.54.32.595348000 PM 
27-MAR-12 10.28.14.797580000 AM 
28-MAR-12 12.28.02.652969000 AM 
27-MAR-12 07.28.02.828746000 PM 

輸出應是

19-MAR-12 03.53.38.189606000 PM 
19-MAR-12 03.54.32.595348000 PM 
19-MAR-12 03.56.27.933365000 PM 
19-MAR-12 04.00.13.387316000 PM 
19-MAR-12 04.04.45.168361000 PM 
27-MAR-12 10.28.14.797580000 AM 
27-MAR-12 07.28.02.828746000 PM 
28-MAR-12 12.28.02.652969000 AM 
09-APR-12 04.08.43.632279000 AM 

我試圖sort命令訂購日期(以日期字段作爲一個字符串),但它是不是給正確的輸出。

回答

5

試試這個:

INPUT.TXT

09-APR-12 04.08.43.632279000 AM 
19-MAR-12 03.53.38.189606000 PM 
19-MAR-12 03.56.27.933365000 PM 
19-MAR-12 04.00.13.387316000 PM 
19-MAR-12 04.04.45.168361000 PM 
19-MAR-12 03.54.32.595348000 PM 
27-MAR-12 10.28.14.797580000 AM 
28-MAR-12 12.28.02.652969000 AM 
27-MAR-12 07.28.02.828746000 PM 

代碼

sort -t "-" -k 3 -k 2M -nk 1 Input.txt 

輸出

19-MAR-12 03.53.38.189606000 PM 
19-MAR-12 03.54.32.595348000 PM 
19-MAR-12 03.56.27.933365000 PM 
19-MAR-12 04.00.13.387316000 PM 
19-MAR-12 04.04.45.168361000 PM 
27-MAR-12 07.28.02.828746000 PM 
27-MAR-12 10.28.14.797580000 AM 
28-MAR-12 12.28.02.652969000 AM 
09-APR-12 04.08.43.632279000 AM 
+0

這輸出'27-MAR-12 07 ... PM'在'27-MAR-12 10 ... AM'之前。 – 2012-07-18 15:08:32

6

Chronicle的解決方案很接近,但錯過了AM/PM的區別,排序27-MAR-12 07.28.02.828746000 PM之前27-MAR-12 10.28.14.797580000 AM。這可以修改:

sort -t- -k 3.1,3.2 -k 2M -k 1n -k 3.23,3.24 

但是,這仍然是非常脆弱的。將日期轉換爲紀元時間並進行數值比較會更好。

+0

+1 O是的..我錯過了...謝謝... :) – Debaditya 2012-07-18 15:39:42

+0

+1特別是建議轉換爲理智的日期格式。 – tripleee 2012-07-19 06:17:11

0

這個腳本通過各種大紀元時間納秒分辨率:

awk '{ 
    t = gensub(/\.([0-9]{2})\./, ":\\1:", 1, $0); 
    command = "date +%s%N -d \x022" t "\x022"; 
    command | getline t; 
    close(command); 
    print t, $0; 
}' unsorted.txt | sort -n -k 1 | cut -d ' ' -f 2- > sorted.txt 
0

你可以使用日期,通常可能是一個不錯的主意,特別是如果你不需要擔心微秒,否則可能可能會縮短微秒並將其作爲輔助排序字段進行排序。

while read a; do 
grep "^${a}" input.txt; 
done < <(sed 's/\./:/;s/\./:/' input.txt | xargs -n3 -I{} date -d"{}" +%s | sort | xargs -n1 -I{} date -d @'{}' +'%d-%^h-%y %I.%M.%S')