日期时间的排序数据在UNIX中使用排序
我想使用sort命令排序我的文本文件数据。 我的数据采用以下格式。日期时间的排序数据在UNIX中使用排序
01-03-17 10:30AM 1367 data_03012017_10_30_02.csv
01-03-17 11:00AM 32 data_03012017_11_00_02.csv
01-03-17 11:30AM 7532 data_03012017_11_30_03.csv
01-03-17 12:00AM 3442 data_03012017_00_00_02.csv
01-03-17 12:00PM 9715 data_03012017_12_00_03.csv
01-03-17 12:30AM 1753 data_03012017_00_30_00.csv
01-03-17 12:30PM 5857 data_03012017_12_30_03.csv
以上是我的文件数据。请帮我分类这些数据。我正陷入AM & PM数据中。请帮助。使用sort -n -t"," -k1.7,1.10 -k1.1,1.2 -k1.4,1.5
命令数据将按日期排序,但不会与AM & PM排序。让我知道如何做到这一点。
我想您的日期转换为更多的东西的标准。
假设你正在使用MM-DD-YY(一种老式的美国会议),你可能会做的POSIX或bash shell中使用BSD date命令如下:
$ while read d t s f; do printf "%s %20d %s\n" "$(date -jf '%m-%d-%y %I:%M%p' "$d $t" '+%F %T')" "$s" "$f"; done < input.txt | sort
2017-01-03 00:00:43 3442 data_03012017_00_00_02.csv
2017-01-03 00:30:43 1753 data_03012017_00_30_00.csv
2017-01-03 10:30:43 1367 data_03012017_10_30_02.csv
2017-01-03 11:00:43 32 data_03012017_11_00_02.csv
2017-01-03 11:30:43 7532 data_03012017_11_30_03.csv
2017-01-03 12:00:43 9715 data_03012017_12_00_03.csv
2017-01-03 12:30:43 5857 data_03012017_12_30_03.csv
或者,分开进行更容易阅读:
while read d t s f; do
printf "%s %20d %s\n" \
"$(date -jf '%m-%d-%y %I:%M%p' "$d $t" '+%F %T')" \
"$s" \
"$f"
done < input.txt | sort
它使用date
命令解释和重新组装您的日期,从当前格式转换成他们的东西,自然排序。请注意,通过这样做,您可以避免使用sort
命令的任何选项。
经过OS X和FreeBSD测试。
假设你的数据在unsorted.dat
,你可以使用下面的代码
cat unsorted.dat | while read line ; do
d=$(echo "$line" | cut -d" " -f1-2)
s=$(echo "$d" | \
sed 's/^\([0-9]*\)-\([0-9]*\)-\([0-9]*\)\(\s.*\)$/\3-\1-\2\4/' | \
xargs -0 date +%s -d)
echo "$s $line"
done | sort -n -k1,1 | cut -d" " -f2-
它所做的是
- 一行
- 读取文件线由前两个提取日期字段列转换为变量
$d
- 如GNU所识别的,将字段顺序从MM-DD-YY更改为YY-MM-DD
date
效用 - 转换的日期秒因为01-01-1970
- 的秒数添加到行
- 排序的秒数
- 剪切含有的秒数出第一个字段。
结果:
01-03-17 12:00AM 3442 data_03012017_00_00_02.csv
01-03-17 12:30AM 1753 data_03012017_00_30_00.csv
01-03-17 10:30AM 1367 data_03012017_10_30_02.csv
01-03-17 11:00AM 32 data_03012017_11_00_02.csv
01-03-17 11:30AM 7532 data_03012017_11_30_03.csv
01-03-17 12:00PM 9715 data_03012017_12_00_03.csv
01-03-17 12:30PM 5857 data_03012017_12_30_03.csv
将日期转换为YY-MM-DD形式后,您可以简单地将它们排序为字符串,而无需转换为秒。 –
@tribble转换为yy-mm-dd是不够的。必须注意am/pm时间的正确顺序 –
首先,展示你先做了什么。 “为我做的工作”键入几乎没有显示的职位 - 或者在这种情况下没有任何努力 - 很少得到回应,并且经常被忽略和/或低估。 – Takarii
@Takarii添加了命令,但它将适用于时间数据,而不适用于AM和PM –
[在unix中排序日期字段]的可能重复(http://stackoverflow.com/questions/11536368/sorting-date-field-in-unix ) – Zlemini