我有一个像这样的日期字段的文件。
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 :(得分: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
我们在#
之后丢弃值。