Unix:从文件中抓取日期并对其进行排序

时间:2014-04-22 06:14:08

标签: unix awk

我有多个看起来像这样的文件:

//file start
$thing1 = {'item1' => '0', 'item2 => '3', 'itemDate' => '2013-10-01'};
$thing2 = {'item1' => '0', 'item2 => '3', 'itemDate' => '2012-11-01'};
$thing3 = {'item1' => '0', 'item2 => '3', 'itemDate' => '2014-12-01'};
//file end

使用Unix,获取文件中所有日期项目的最佳方法是什么。我知道我在文件中查找的项目看起来像

{somethingDate = '1111-11-11'}

从此我想抓住'1111-11'11'。文件一将有多个'fileOneDate'条目,文件二将有多个'fileTwoDate'条目等。我的目标是采取所有这些日期'* Date',删除重复项,并将它们排序到输出文件,使用sort命令和管道很容易。但是,我坚持第一部分。到目前为止我看到的是这样的:

<command I'm working on now that grabs dates> | sort -n  > outputfile.txt

我相信要走的路是AWK脚本。解析这些文件的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

你需要这样吗?

sed -n "s/.*'\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\)'.*/\1/p"

如果-r中有sed选项,

sed -nr "s/.*'([0-9]{4}-[0-9]{2}-[0-9]{2})'.*/\1/p"

<强>测试

sat:~# echo "{somethingDate = '1111-11-11'}" | sed -n "s/.*'\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\)'.*/\1/p"
1111-11-11
sat:~#
sat:~# echo "$thing1 = {'item1' => '0', 'item2 => '3', 'itemDate' => '2013-10-01'};" | sed -n "s/.*'\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\)'.*/\1/p"
2013-10-01

答案 1 :(得分:1)

grep -o是提取文字的最简单方法 sort -u排序(duh)并删除重复项。

grep -oE '\<[0-9]{4}-[0-9]{2}-[0-9]{2}\>' <<'END' | sort -u
$thing1 = {'item1' => '0', 'item2 => '3', 'itemDate' => '2013-10-01'};
$thing2 = {'item1' => '0', 'item2 => '3', 'itemDate' => '2012-11-01'};
$thing3 = {'item1' => '0', 'item2 => '3', 'itemDate' => '2014-12-01'};
$thing2b= {'item1' => '0', 'item2 => '3', 'itemDate' => '2012-11-01'};
$thing2c= {'item1' => '0', 'item2 => '3', 'itemDate' => 'foo2012-01-01bar'};
END
2012-11-01
2013-10-01
2014-12-01

答案 2 :(得分:0)

如果您的示例文件名为datefile,则:

$ sed -nr "s/.*Date' => '([^']+)'.*/\1/p" datefile | sort -n
2012-11-01
2013-10-01
2014-12-01

上面的正则表达式查找包含Date' => 'datestring'的行并打印日期字符串。

更详细地说,sed命令包含一个替换,它以sed - 样式写成s/old/new/optionsold部分有点复杂,所以我将逐一介绍它:old正则表达式查找(a).*表示任何内容(任意数量的任何字符),后跟(b)Date' => ',其次是(c)([^']+),这意味着一个或多个不是单引号的字符,后跟(d)单引号,然后是(e).* ,意思是什么。如果匹配,那么该行将替换为日期字符串(保存为\1,因为日期字符串正则表达式是parens)然后,由于表达式末尾的p,该日期已打印。由于-n选项被赋予sed,因此不会打印没有匹配日期字符串的行。

如果您的sed不支持-r(OSX),那么请使用类似的表达式,但添加一些反斜杠:

sed -n "s/.*Date' => '\([^']\+\)'.*/\1/p" datefile | sort -n