0

我有一系列管道可以将文本文件中的日期转换为独特的、人类可读的输出并拉出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
4

3 回答 3

6

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

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

根据以下 twalberg 的建议进行编辑:

sort -k1,1M -k2,2n test.txt
于 2013-10-30T15:27:34.420 回答
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
于 2013-10-30T15:28:56.027 回答
0

和 sed -n "1 { H x s/. (\n). /01 Jan\102 Feb\103 Mar\104 Apr\105 May\106 Jun\107 Jul\105 Aug\109 Sep\110 Oct\111 Nov\ 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不起作用

于 2013-10-31T07:34:51.197 回答