日期时间的排序数据在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排序。让我知道如何做到这一点。

+0

首先,展示你先做了什么。 “为我做的工作”键入几乎没有显示的职位 - 或者在这种情况下没有任何努力 - 很少得到回应,并且经常被忽略和/或低估。 – Takarii

+0

@Takarii添加了命令,但它将适用于时间数据,而不适用于AM和PM –

+1

[在unix中排序日期字段]的可能重复(http://stackoverflow.com/questions/11536368/sorting-date-field-in-unix ) – Zlemini

我想您的日期转换为更多的东西的标准。

假设你正在使用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- 

它所做的是

  1. 一行
  2. 读取文件线由前两个提取日期字段列转换为变量$d
  3. 如GNU所识别的,将字段顺序从MM-DD-YY更改为YY-MM-DD date效用
  4. 转换的日期秒因为01-01-1970
  5. 的秒数添加到行
  6. 排序的秒数
  7. 剪切含有​​的秒数出第一个字段。

结果:

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

将日期转换为YY-MM-DD形式后,您可以简单地将它们排序为字符串,而无需转换为秒。 –

+0

@tribble转换为yy-mm-dd是不够的。必须注意am/pm时间的正确顺序 –