我有一个包含以下示例文本的文件。 (实际文字很大)。
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);
答案 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