最大値と最小値の差が特定のしきい値より大きいレコードを印刷する方法は? [閉鎖]

最大値と最小値の差が特定のしきい値より大きいレコードを印刷する方法は? [閉鎖]

次の 2 つのデータ列があります。

[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()よりも効率的でメモリも少なくなりますが、コードが複雑になります。しかし、入力が非常に大きくないと、大きな影響を与える可能性はありません。

おすすめ記事