perl awk或sed,在两个时间戳之间搜索

时间:2014-05-09 19:46:04

标签: perl time awk sed timestamp

我有一个包含以下示例文本的文件。 (实际文字很大)。

2014/05/08-19:15:44.544824-<String1>
2014/05/08-19:21:54.544824-<String2>
2014/05/08-19:34:59.564461-<String3>

我必须在两个时间戳之间提取数据,如19:15:00 - 19:20:00,依此类推,直到eof。我尝试过使用sed&amp; awk,但问题是,在某些方面,他们会给出所有的东西。 (例如,他们会在19:15:00之前发布所有内容 - &gt; EOF)。我使用的命令是

awk '/19:15:00/,/19:20:00/' InputFile

sed '/19:15:00/,/19:20:00/p' Inputfile.

有关如何在perl或sed&amp;中执行此操作的任何想法awk,哪个可能真的有效?错误的输出是否与时间戳的格式有关? (只是想)

PS。我使用以下代码制作时间戳。 (是否可能因为本地时间功能发生这种情况?

$curr = timelocal(0, 0, 0, (split /\//, $ARGV[0])[1], (split /\//, $ARGV[0])[0]-1, (split /\//, $ARGV[0])[-1]);
$currentTime = strftime "%H:%M:%S", localtime($curr);

5 个答案:

答案 0 :(得分:3)

使用perl单线程。抓住时间,然后进行比较。

perl -ne '$t = /(\d+:[\d:.]+)/ ? $1 : undef; 
    print if $t ge "19:15:00" && $t le "19:20:00";' file.txt

答案 1 :(得分:2)

您在上面显示的awk和sed命令无法正常工作,因为他们正在进行模式匹配 - 他们并没有按时间顺序将时间戳相互比较(即,如果它没有&#39 ; t看到一个确切的19:20:00字符串,即使它沿途看到一个19:21:00它也将继续到最后。)

你可以在perl中使用类似于你在生成时间戳的末尾显示的两行,但是反过来解析它们,将它们转换为时间对象并比较它们的值。

答案 2 :(得分:1)

可能不是很明显,但是具有按固定宽度字段递增的数量级的日期/时间表示(如ISO 8601 %Y-%m-%dT%H:%M:%S)可以简单地比较为字符串,因此{{1是 true ,而'19:21:54.544824' gt '19:20' false

这意味着您可以使用19:15:44.544824 lt '19:15'提取字段并进行文字比较,例如

split

<强>输出

use strict;
use warnings;

while (<DATA>) {
  my $time = (split /-/)[1];
  print if $time ge '19:15' and $time le '19:20';
}

__DATA__
2014/05/08-19:15:44.544824-<String1>
2014/05/08-19:21:54.544824-<String2>
2014/05/08-19:34:59.564461-<String3>

答案 3 :(得分:1)

为什么所有的复杂性?

$ awk -F'[-.]' '"19:15:00"<=$2 && $2<="19:20:00"' file
2014/05/08-19:15:44.544824-<String1>
如果文件已排序,则

或更低,但效率更高:

$ awk -F'[-.]' '$2>"19:20:00"{exit} $2>="19:15:00"' file
2014/05/08-19:15:44.544824-<String1>

答案 4 :(得分:0)

使用awk

awk '{gsub(/:/,X,$2)}$2>=191500&&$2<=192000' FS="[-.]" file