다음과 같은 두 개의 데이터 열이 있습니다.
[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()
것보다 효율적이고 메모리도 적게 사용하지만 코드가 더 복잡해집니다. 그러나 입력이 매우 크지 않으면 큰 영향을 미칠 가능성이 없습니다.