如何使用AM | PM对日期文件进行排序

时间:2016-03-19 07:45:14

标签: bash sorting

我有一个像这样的日期字段的文件。

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”部分进行排序。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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我们在#之后丢弃值。