awk를 사용하여 "스크롤 최대값"을 계산하고 2열에 해당 레코드를 인쇄합니다.

awk를 사용하여 "스크롤 최대값"을 계산하고 2열에 해당 레코드를 인쇄합니다.

내 파일은 다음과 같습니다(실제로는 수백만 줄).

1   75
2   188
3   279
4   267
5   100
6   28
7   479
8   325
9   225
10  181

처음 5개 행(1~5행) 중 두 번째 열의 최대값을 찾고 첫 번째 열의 해당 값과 함께 해당 최대값을 인쇄하고 싶습니다. 그런 다음 다음 5개 행(6~10행)으로 이동하여 동일한 작업을 수행합니다.

출력은 다음과 같아야 합니다.

3 279
7 479

지금까지 다음과 같이 롤링 최대값을 계산할 수 있습니다.

awk '{for(i=1;i<=NF;i++) if($i>maxval) maxval=$i;} NR%5==0 { print maxval; maxval= -1}' input.file

그러나 첫 번째 열에 해당 값을 인쇄할 수 없습니다. 예를 들어 두 번째 변수를 정의하려고 시도했지만 성공하지 want=$1못했습니다 print maxval, want. 나는 이것이 배열로 이루어질 수 있다는 막연한 인상을 받았지만 모든 시도는 성공하지 못했습니다.

TP

답변1

내 생각엔 루프가 끝나지 않을 것 같아필드당신이 원하는 것. 대신, 모듈로 5로 레코드 번호(또는 여러 파일을 처리할 수 있는 파일 레코드 번호)를 살펴보세요.

$ awk '!((FNR-1)%5) || $2 > max {x = $0; max = $2} !(FNR%5) {print x}' file
3   279
7   479
  • FNR1,6,... OR이 현재 실행 중인 최대값보다 큰 경우 $2현재 행/최대값을 저장합니다.

  • if FNRis 5,10,... 현재 줄/최대값 인쇄

답변2

awk답변은 아니지만 쉘툴을 좋아하시는 분들을 위해암소 비슷한 일종의 영양 split방법 작동 방식:

split -l 5 --filter 'sort -n -k 2 | tail -1'  file

관련 정보