Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何使用AM | PM对日期文件进行排序_Bash_Sorting - Fatal编程技术网

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

Bash 如何使用AM | PM对日期文件进行排序,bash,sorting,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”部分进行排序。非常感谢

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

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”部分进行排序。非常感谢您的帮助。

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

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
读取时-r;做
IFS=“|”read-ra arr可能是的副本,我建议使用。