Bash unix中的排序日期字段

Bash unix中的排序日期字段,bash,shell,unix,sorting,Bash,Shell,Unix,Sorting,我有一个包含数十万条记录的文本文件。其中一个字段是日期字段。 有没有办法根据日期字段对文件进行排序 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-1

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

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命令对日期进行排序(将日期字段作为字符串),但没有给出正确的输出。

尝试以下操作:

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 
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
代码

 sort -t "-"  -k 3 -k 2M -nk 1 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 
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

编年史的解决方案很接近,但忽略了AM/PM的区别,在
27-MAR-12 10.28.14.797580000 AM
之前对
27-MAR-12 07.28.02.828746000 PM
进行排序。这可以修改:

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

但这仍然非常脆弱。最好将日期转换为纪元时间并进行数字比较。

此脚本按纪元时间以纳秒分辨率排序:

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

您可以使用date,这通常是一个不错的主意,特别是如果您不需要担心微秒,否则您可能会将微秒去掉,并将其作为二级排序字段进行排序

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')
在读取一个文件时;做
grep“^${a}”input.txt;

完成<此输出<代码>2007年3月27日。。。2012年3月27日之前的下午。。。AM