내 파일은 다음과 같습니다(실제로는 수백만 줄).
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
FNR
1,6,... OR이 현재 실행 중인 최대값보다 큰 경우$2
현재 행/최대값을 저장합니다.if
FNR
is 5,10,... 현재 줄/최대값 인쇄
답변2
awk
답변은 아니지만 쉘툴을 좋아하시는 분들을 위해암소 비슷한 일종의 영양 split
방법 작동 방식:
split -l 5 --filter 'sort -n -k 2 | tail -1' file