2

我有一个巨大的文件,每一行都以时间戳开头,如下所示。我需要一种方法来 grep 两个日期之间的行。是否有任何简单的方法可以使用 sed 或 awk 来执行此操作,而不是提取每行中的日期字段并比较日/月/年?

例如,需要通过检查第一个字段中的时间戳来提取 2013-06-01 到 2013-06-15 之间的数据

文件内容:

2013-06-02T19:44:59;(3305,3308,2338,102116);aaaa;xxxx
2013-06-14T20:01:58;(2338);aaaa;xxxx
2013-06-12T20:01:58;(3305,3308,2338);bbbb;xxxx
2013-06-13T20:01:59;(3305,3308,2338,102116);bbbb;xxxx
2013-06-13T20:02:53;(2338);bbbb;xxxx
2013-06-13T20:02:53;(3305,3308,2338);aaaa2;xxxx
2013-06-13T20:02:54;(3305,3308,2338,102116);aaaa2;xxxx
2013-06-14T20:31:58;(2338);aaaa2;xxxx
2013-06-14T20:31:58;(3305,3308,2338);aaaa;xxxx
2013-06-15T20:31:59;(3305,3308,2338,102116);bbbb;xxxx
2013-06-16T20:32:53;(2338);aaaa;xxxx
2013-06-16T20:32:53;(3305,3308,2338);aaaa2;xxxx
2013-06-16T20:32:54;(3305,3308,2338,102116);bbbb;xxxx
4

3 回答 3

2

它可能不是您的首选,但 Perl 非常适合这项任务。

perl -ne "print if ( m/2013-06-02/ .. m/2013-06-15/ )" myfile.txt

其工作方式是,如果第一个触发器匹配(即m/2013-06-02/),那么条件(print)将在每一行上执行,直到第二个触发器匹配(即m/2013-06-15)。

m/2013-06-01/但是,如果您指定为触发器,则此技巧将不起作用,因为这在您的文件中永远不会匹配。

一个不太令人兴奋的技术是从每一行中提取一些文本并测试:

perl -ne 'if ( m/^([0-9-]+)/ ) { $date = $1; print if ( $date ge "2013-06-01" and $date le "2013-06-15" ) }' myfile.txt

(测试了表达式和工作)。

于 2013-07-04T08:43:59.050 回答
2

您可以尝试以下方法:

awk -F'-|T' '$1==2013 && $2==06 && $3>=01 && $3<=15' hugefile 
于 2013-07-04T08:55:08.423 回答
1

您可以使用sed打印两个图案之间的所有线条。在这种情况下,您必须首先sort访问文件,因为日期是交错的:

$ sort file | sed -n '/2013-06-12/,/2013-06-15/p'
2013-06-12T20:01:58;(3305,3308,2338);bbbb;xxxx
2013-06-13T20:01:59;(3305,3308,2338,102116);bbbb;xxxx
2013-06-13T20:02:53;(2338);bbbb;xxxx
2013-06-13T20:02:53;(3305,3308,2338);aaaa2;xxxx
2013-06-13T20:02:54;(3305,3308,2338,102116);aaaa2;xxxx
2013-06-14T20:01:58;(2338);aaaa;xxxx
2013-06-14T20:31:58;(2338);aaaa2;xxxx
2013-06-14T20:31:58;(3305,3308,2338);aaaa;xxxx
2013-06-15T20:31:59;(3305,3308,2338,102116);bbbb;xxxx
于 2013-07-04T09:06:37.283 回答