【问题标题】:Shell script to extract data from file between two date ranges用于从两个日期范围之间的文件中提取数据的 Shell 脚本
【发布时间】:2013-07-02 04:30:06
【问题描述】:

我有一个巨大的文件,每一行都以时间戳开头,如下所示。我需要一种方法来 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

【问题讨论】:

  • 你尝试了什么?你有尝试过什么吗?

标签: bash date sed awk timestamp


【解决方案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

【讨论】:

  • 谢谢,但如果文件中不存在输入日期模式,这可能也不起作用。
  • 我认为这个答案非常有用,以防其他人遇到这个问题并对数据进行了排序。谢谢!
【解决方案2】:

你可以试试这样的:

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

【讨论】:

  • 感谢您的回答,但这不能满足我的全部需求,因为我必须进一步修改它以提取不同年份/月份之间的数据
  • @Amogh 抱歉,我无法理解您的全部需求 - 需要通过检查第一个时间戳来提取 2013-06-01 到 2013-06-15 之间的数据字段
【解决方案3】:

它可能不是您的首选,但 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

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

【讨论】:

  • @Vijay 第一种技术仅在日期按排序顺序时才有效。第二种技术适用于未排序的数据。
  • 非常感谢!!第二种技术非常适合我的要求。
猜你喜欢
  • 1970-01-01
  • 2011-03-24
  • 2012-12-21
  • 1970-01-01
  • 2010-11-19
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多