用于从两个日期范围之间的文件中提取数据的Shell脚本

时间:2013-07-04 08:40:24

标签: bash date sed awk timestamp

我有一个巨大的文件,每行以时间戳开头,如下所示。我需要一种方法来在两个日期之间画线。有没有简单的方法来使用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

3 个答案:

答案 0 :(得分:2)

它可能不是你的第一选择,但Perl非常适合这项任务。

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

这种方法的工作方式是,如果第一个触发器匹配(即m/2013-06-02/),则条件(print)将在每一行上执行,直到第二个触发器匹配为止(即{{1 }})。

但是,如果您将m/2013-06-15指定为触发器,则此技巧将无效,因为您的文件中永远不会匹配此项。

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

m/2013-06-01/

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

答案 1 :(得分:2)

您可以尝试以下内容:

awk -F'-|T' '$1==2013 && $2==06 && $3>=01 && $3<=15' hugefile 

答案 2 :(得分: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