최대값과 최소값의 차이가 특정 임계값보다 큰 레코드를 인쇄하는 방법은 무엇입니까? [폐쇄]

최대값과 최소값의 차이가 특정 임계값보다 큰 레코드를 인쇄하는 방법은 무엇입니까? [폐쇄]

다음과 같은 두 개의 데이터 열이 있습니다.

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

관련 정보