1~3열 전체와 공통 4열의 최대값을 구합니다.

1~3열 전체와 공통 4열의 최대값을 구합니다.

입력 txt 파일이 주어지면:

$ cat input.txt
-1 23 34 cheese
34 20 15 cheese
-4 -4 20 tomato
13 -3 14 tomato
4  6   7 tomato
-3 -3 -3 potato

다음을 사용하여 열 1의 가장 큰 값으로 레코드를 유지하면서 열 4를 기반으로 데이터를 통합할 수 있습니다.

$ cat input.txt | sort -k4 -k1,1rn | uniq -f3

이것은 만든다:

34 20 15 cheese
13 -3 14 tomato
-3 -3 -3 potato

하지만 4번째 컬럼의 데이터를 통일하고, 동일한 4번째 컬럼의 모든 레코드 중 최대값을 유지하고 싶습니다. 비슷하다:

34 23 34 cheese
13 6 20 tomato
-3 -3 -3 potato

이를 달성하는 빠른 방법이 있습니까?

답변1

AWK 사용:

#!/usr/bin/awk -f
!keys[$4] { keys[$4] = 1; for (i = 1; i < 4; i++) max[$4][i] = $i }
{ for (i = 1; i < 4; i++) {
    if (max[$4][i] < $i) max[$4][i] = $i
} }
END { for (key in max) print max[key][1], max[key][2], max[key][3], key }

이는 네 번째 열의 각 키에 대한 세 가지 최대값을 추적합니다.

주의할 점은 키의 순서가 유지되지 않는다는 것입니다.

관련 정보