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命令来命令日期(将日期字段作为字符串),但它没有给出正确的输出.
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)
但那仍然非常脆弱.将日期转换为纪元时间并以数字方式进行比较会好得多.
试试这个 :
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)