2016-03-19 57 views
1

我有一个包含日期字段的文件。如何使用AM对日期文件进行排序| PM

20|1|124|Mar 19 2016 3:00AM 
20|1|144|Mar 19 2016 2:00PM 
43|1|146|Mar 19 2016 5:30AM 
42|1|158|Mar 19 2016 1:50PM 
40|1|15|Mar 19 2016 2:30AM 

我想按日期字段排序,这样AM会在PM之前出现。到目前为止,我有这个:

sort -t"|" -k4 testfile. 

但我不知道如何排序“AM”和“PM”部分。任何帮助表示赞赏。

+0

可能重复[bash排序 - 我如何使用时间戳排序](http://stackoverflow.com/questions/17844072/bash-sort-how-do-i-sort-using-timestamp) –

+1

我建议使用[Schwartzian变换](https://en.wikipedia.org/wiki/Schwartzian_transform)。 – Cyrus

回答

1

您可以使用:

while read -r; do 
    IFS='|' read -ra arr <<< "$REPLY" 
    date -d "${arr[-1]}" "+$REPLY#%s" 
done < file | sort -t# -k2 | cut -d# -f1 

40|1|15|Mar 19 2016 2:30AM 
20|1|124|Mar 19 2016 3:00AM 
43|1|146|Mar 19 2016 5:30AM 
42|1|158|Mar 19 2016 1:50PM 
20|1|144|Mar 19 2016 2:00PM 

使用date命令我们解析管道分隔字段中的最后一个字段,并在由#分隔的每行中添加EPOCH值。然后使用sort我们做第二场排序(EPOCH值),最后使用cut我们丢弃#后的值。

1

您可以使用临时分隔符(即|),使AM/PM可以用作排序字段列:

$ cat sourcefile | sed 's/\(.\)M$/|\1M/' | sort -t"|" -k5 -k4 | sed 's/|\(.\)M/\1M/' 
40|1|15|Mar 19 2016 2:30AM 
20|1|124|Mar 19 2016 3:00AM 
43|1|146|Mar 19 2016 5:30AM 
42|1|158|Mar 19 2016 1:50PM 
20|1|144|Mar 19 2016 2:00PM