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