如何使用 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"部分进行排序。任何帮助,不胜感激。

您可以使用:

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我们在#之后丢弃值。

可以使用临时分隔符(即|)将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

最新更新