![最大値と最小値の差が特定のしきい値より大きいレコードを印刷する方法は? [閉鎖]](https://linux33.com/image/206918/%E6%9C%80%E5%A4%A7%E5%80%A4%E3%81%A8%E6%9C%80%E5%B0%8F%E5%80%A4%E3%81%AE%E5%B7%AE%E3%81%8C%E7%89%B9%E5%AE%9A%E3%81%AE%E3%81%97%E3%81%8D%E3%81%84%E5%80%A4%E3%82%88%E3%82%8A%E5%A4%A7%E3%81%8D%E3%81%84%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%8D%B0%E5%88%B7%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F%20%5B%E9%96%89%E9%8E%96%5D.png)
次の 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()
よりも効率的でメモリも少なくなりますが、コードが複雑になります。しかし、入力が非常に大きくないと、大きな影響を与える可能性はありません。