awk를 사용하여 열에서 최대값을 찾은 다음 데이터가 발견된 행의 다른 필드를 인쇄하려면 어떻게 해야 합니까?

awk를 사용하여 열에서 최대값을 찾은 다음 데이터가 발견된 행의 다른 필드를 인쇄하려면 어떻게 해야 합니까?

구체적인 예는 열 5에서 최대값을 찾은 다음 해당 값과 연결된 두 번째 필드를 찾는 것입니다. 예를 들어:

1  text1  1   1   5
2  text2  2   2   10 
3  text3  3   3   15
4  text4  4   4   50
5  text5  5   5   25

이것은 내 스크립트입니다. 최대값을 찾는 함수로 시작한 다음, 최대값이 발견된 동일한 행의 두 번째 필드에 대한 데이터를 인쇄하려고 시도합니다.

function max(val1,val2){
        if (val1 > val2)
                return val1
        else
                return val2
}

BEGIN {largest = 0}

{largest = max(largest,$5 + 0)}
$5 ~ largest {print $2}

END {}

이것은 결국 인쇄됩니다

text1
text2
text3
text4

새로운 최대값을 찾을 때마다 두 번째 필드를 인쇄하기 때문입니다. 발견된 마지막 최대값만 인쇄하는 방법을 찾으려고 노력 중이므로 "text4"만 인쇄됩니다. 닫는 블록을 넣으려고 했지만 "$5 ~ largest {print $2}"구문 오류가 발생했습니다.

답변1

모든 awk 스크립트는 다음과 같이 단순화될 수 있습니다.

awk 'max<$5 || NR==1{ max=$5; data=$2 } END{ print data }' infile

또는 다섯 번째 열에서 "두 번째 열의 모든 행을 동일한 최대값으로 유지"합니다.

awk 'max<$5 || NR==1 { max=$5; data=$2; next }
     max==$5{ data= data ORS $2 }
END{ print data }' infile

직접 작성한 스크립트와 관련하여 입력 파일을 두 번 처리해야 합니다. 먼저 최대값을 찾고, 두 번째로 해당 최대값이 있는 행의 두 번째 열을 인쇄해야 합니다. 다음과 같습니다.

awk 'function max(val1, val2){
        if (val1 > val2)
                return val1
        else
                return val2
}

BEGIN { largest = 0 }

NR==FNR{ largest = max(largest,$5 + 0); next }
$5==largest { print $2 }' infile infile

답변2

나는 당신의 질문을 다음과 같이 해석합니다.

열 5에서 최대값을 찾고 해당 최대값을 갖는 열 2의 모든 값을 인쇄합니다.

awk '
    NR == FNR {
        if (FNR == 1 || $5 > max) max = $5
        next
    }
    $5 == max {print $2}
' file file

그러면 파일이 두 번 처리됩니다. 한 번은 최대값을 찾고, 한 번은 일치하는 값을 인쇄합니다. 런타임을 늘리기 위해 메모리 사용량을 줄이는 것에 무게를 두고 있습니다.

관련 정보