구체적인 예는 열 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
그러면 파일이 두 번 처리됩니다. 한 번은 최대값을 찾고, 한 번은 일치하는 값을 인쇄합니다. 런타임을 늘리기 위해 메모리 사용량을 줄이는 것에 무게를 두고 있습니다.