在unix中排序日期字段

use*_*046 3 unix sorting bash shell

我有包含数十万条记录的文本文件.其中一个字段是日期字段.有没有办法根据日期字段对文件进行排序?

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
Run Code Online (Sandbox Code Playgroud)

输出应该是

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
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用sort命令来命令日期(将日期字段作为字符串),但它没有给出正确的输出.

Wil*_*ell 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
Run Code Online (Sandbox Code Playgroud)

但那仍然非常脆弱.将日期转换为纪元时间并以数字方式进行比较会好得多.


Deb*_*tya 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 
Run Code Online (Sandbox Code Playgroud)

 sort -t "-"  -k 3 -k 2M -nk 1 Input.txt
Run Code Online (Sandbox Code Playgroud)

产量

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
Run Code Online (Sandbox Code Playgroud)