我想使用sort命令对文本文件数据进行排序。 我的数据格式如下。
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&下午。让我知道如何做到这一点。
答案 0 :(得分:3)
假设您的数据位于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
date
实用程序结果:
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
答案 1 :(得分:2)
我会将您的日期转换为更标准的日期。
假设您正在使用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中测试过。