![최대값과 최소값의 차이가 특정 임계값보다 큰 레코드를 인쇄하는 방법은 무엇입니까? [폐쇄]](https://linux55.com/image/206918/%EC%B5%9C%EB%8C%80%EA%B0%92%EA%B3%BC%20%EC%B5%9C%EC%86%8C%EA%B0%92%EC%9D%98%20%EC%B0%A8%EC%9D%B4%EA%B0%80%20%ED%8A%B9%EC%A0%95%20%EC%9E%84%EA%B3%84%EA%B0%92%EB%B3%B4%EB%8B%A4%20%ED%81%B0%20%EB%A0%88%EC%BD%94%EB%93%9C%EB%A5%BC%20%EC%9D%B8%EC%87%84%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20%5B%ED%8F%90%EC%87%84%5D.png)
다음과 같은 두 개의 데이터 열이 있습니다.
[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()
것보다 효율적이고 메모리도 적게 사용하지만 코드가 더 복잡해집니다. 그러나 입력이 매우 크지 않으면 큰 영향을 미칠 가능성이 없습니다.