如何打印最大值和最小值之差大于某个阈值的记录?

如何打印最大值和最小值之差大于某个阈值的记录?

我有两列这样的数据:

[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()最后调用和,那么效率会更高,内存占用也会更少,但代码会更复杂。但除非输入非常大,否则不太可能产生太大影响。

相关内容