在日历年中订购一系列日期

时间:2013-10-30 15:21:56

标签: python perl bash sed awk

我有一系列管道将文本文件中的日期转换为唯一的,人类可读的输出并拉出MM DD。现在我想求输出,以便日期按照它们在一年中发生的顺序显示。有人知道使用标准外壳或在* 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

3 个答案:

答案 0 :(得分:6)

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

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

根据twalberg的建议编辑如下:

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

答案 1 :(得分:1)

分两步:

$ 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

答案 2 :(得分:0)

和sed -n“1 {        H        X        s /。(\ n)。 / 01 Jan \ 102 Feb \ 103 Mar \ 104 Apr \ 105 5月\ 106 Jun \ 107 Jul \ 105 Aug \ 109 Sep \ 110 Oct \ 111 Nov \ 112 DEC /        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不起作用时