我有两列这样的数据:
[id1] 09:51:07,175
[id1] 09:51:07,215
[id2] 10:09:47,550
[id2] 10:09:47,588
[id2] 10:09:47,942
[id2] 10:09:47,947
[id3] 10:05:25,945
[id3] 10:05:26,001
第一列是 ID,另一列是时间。现在,如果 ID 的最小时间和最大时间之差大于 x,我想打印 ID。
如果 x = 100,所需的输出将为:
id2
因为 max(id2) = 10:09:47,947 和 min(id2) = 10:09:47,550 并且它们的差为 397。如果 x=30,所需的输出将是:
id1
id2
id3
因为
max(id1) - min(id1) = 40
max(id2) - min(id2) = 397
max(id3) - min(id3) = 56
如果 x 为 50,则输出将为:
id2
id3
我该如何处理这个问题?
答案1
典型的工作perl
:
perl -MList::Util=min,max -lsne '
push @{$v{$1}}, $5 + 1000 * ($4 + 60 * ($3 + 60 * $2)) if
m{^\[(.*)\] (\d\d):(\d\d):(\d\d),(\d+)$};
END{
for (keys %v) {
print if max(@{$v{$_}}) - min(@{$v{$_}}) > $threshold
}
}' -- -threshold=100 < your-file
如果我们在读取行时计算最小值和最大值,而不是存储所有值并min()
在max()
最后调用和,那么效率会更高,内存占用也会更少,但代码会更复杂。但除非输入非常大,否则不太可能产生太大影响。