排序日期时间数据在UNIX中使用sort

时间:2017-01-03 15:13:54

标签: linux shell sorting unix

我想使用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&下午。让我知道如何做到这一点。

2 个答案:

答案 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-

它做的是

  1. 逐行阅读文件
  2. 将前两列中的日期字段提取为变量$d
  3. 将GNU date实用程序
  4. 识别的字段顺序从MM-DD-YY更改为YY-MM-DD
  5. 将日期转换为自01-01-1970以来的秒数
  6. 添加行数
  7. 按秒数排序
  8. 剪切包含秒数的第一个字段。
  9. 结果:

    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中测试过。