【问题标题】:Order a sequence of dates as they occur in calendar year对日历年中出现的日期序列进行排序
【发布时间】:2013-11-10 07:07:36
【问题描述】:

我有一系列管道将文本文件中的日期转换为独特的、人类可读的输出并提取MM DD。现在我想使用输出,以便日期按照它们在一年中出现的顺序显示。有人知道使用标准 shell 或在 *nix 上易于安装的软件包的好技术吗?

Feb 4
Feb 5
Feb 6
Feb 7
Feb 8
Jan 1
Jan 10
Jan 11
Jan 12
Jan 13
Jan 2
Jan 25
Jan 26
Jan 27
Jan 28
Jan 29
Jan 3
Jan 30
Jan 31
Jan 4
Jan 5
Jan 6
Jan 7
Jan 8
Jan 9

【问题讨论】:

    标签: python perl bash sed awk


    【解决方案1】:

    有一个名为sort 的实用程序带有一个选项-M,用于按月排序。如果你安装了它,你可以使用它。例如:

    sort -k1 -M test.txt
    
    • -k1:第一栏
    • -M: 按月排序

    根据 twalberg 的建议编辑如下:

    sort -k1,1M -k2,2n test.txt
    

    【讨论】:

    • 并非所有sort 的实现都支持-M 选项,但如果可用,它很有用。
    • 你可能想改用-k1M -k2n
    • 为了改进这一点,我建议sort -k1,1M -k2,2n。原因是-k1 的意思是对从字段1 开始 的键进行排序并延伸到该行的其余部分,可能不会产生理想的结果。最好明确指出字段 1 将按月份排序,字段 2 作为数值排序(否则您可能会在 1 之前得到 10,等等...)。
    • 是的,这样会更聪明。
    【解决方案2】:

    分两步:

    $ while read line; do date -d "$line" "+%Y%m%d"; done < file | sort -n > temp
    $ while read line; do date -d "$line" "+%b %d"; done < temp > file
    

    首先,我们将日期转换为YYYYMMDD 并对其进行排序:

    $ while read line; do date -d "$line" "+%Y%m%d"; done < file | sort -n > temp
    $ cat temp
    20130101
    20130102
    20130103
    20130104
    20130105
    20130106
    20130107
    20130108
    20130109
    20130110
    20130111
    20130112
    20130113
    20130125
    20130126
    20130127
    20130128
    20130129
    20130130
    20130131
    20130204
    20130205
    20130206
    20130207
    20130208
    

    然后我们将它们打印回之前的格式%b %d:

    $ while read line; do date -d "$line" "+%b %d"; done < temp > file
    $ cat file
    Jan 01
    Jan 02
    Jan 03
    Jan 04
    Jan 05
    Jan 06
    Jan 07
    Jan 08
    Jan 09
    Jan 10
    Jan 11
    Jan 12
    Jan 13
    Jan 25
    Jan 26
    Jan 27
    Jan 28
    Jan 29
    Jan 30
    Jan 31
    Feb 04
    Feb 05
    Feb 06
    Feb 07
    Feb 08
    

    【讨论】:

    • 我接受了这个解决方案,因为它快速、有效并且依赖于最小的工具集。但是,我认为到目前为止我看到的所有答案都是合法且高质量的。
    【解决方案3】:

    和 sed -n "1 { H X s/.(\n)./01 一月\102 二月\103 三月\104 四月\105 五月\106 六月\107 七月\105 八月\109 九月\110 十月\111 十一月\112十二月/ X }

    s/^\(.\{3\}\) \([0-9]\) *$/\1 0\2/
    H
    
    $  {
    x
    
    t subs
    : subs
       s/^\([0-9]\{2\}\) \([[:alpha:]]\{3\}\)\(\n\)\(.*\)\n\2/\1 \2\3\4\3\1 \2/
       t subs
       s/^[0-9]\{2\} [[:alpha:]]\{3\}\n//
       t subs
       p
       }
    " | sort | sed "s/^[0-9][0-9] //"
    

    仍然需要排序(或者更复杂的 sed 进行排序)并且当 sort -M 不起作用时

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-25
      • 2018-10-01
      • 1970-01-01
      • 2014-06-22
      • 2020-12-21
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多