AWK: 최대 열 값이 발생하는 행을 가져옵니다.

AWK: 최대 열 값이 발생하는 행을 가져옵니다.

다섯 번째 열의 최대값에 관심이 있습니다. 하지만 행의 6번째와 9번째 값을 배열로 캡처할 수도 있기를 원합니다. 어떻게 해야 하나요?

아래 명령은 다섯 번째 열 값만 가져오려고 시도합니다.

myVar=$(bash myScript.sh | awk -v max=0 '{if($5>max){max=$5;max6=$6;max9=$9}}END{print $5}')

편집: print $5 는 열 5의 최대값을 인쇄합니다.

감사해요.

답변1

아래와 같은 입력 파일이 주어지면(값이 양수인지 음수인지는 중요하지 않지만, 사람들은 종종 이런 일이 발생한다는 사실을 잊어버리고 적어도 하나의 값이 다음보다 크다고 가정하는 스크립트를 작성하기 때문에 모든 음수를 사용하는 것이 중요한 테스트입니다. 0, 초기 테스트에서는 훌륭하게 작동했지만 실제 값이 주어진 후 6개월 후 현장에서 이상하게 실패했습니다.

$ cat file
a b c d  -5 foo e f bar
a b c d  -3 is e f stuff
a b c d -17 this e f here

5번째, 6번째, 9번째 값을 인쇄하는 방법은 다음과 같습니다(분명히 가지고 있지 않은 값을 사용하여) cat file.bash myScript.sh

$ cat file | awk '(NR==1) || ($5>m[5]){ split($0,m) } END{ print m[5], m[6], m[9] }'
-3 is stuff

이를 쉘 변수에 저장하려는 경우 가장 쉬운 방법은 쉘 배열에 저장하는 것입니다. 예를 들어 이러한 필드의 값에 따라 이것이 필요할 수 있습니다.

$ arr=( $(cat file | awk '(NR==1) || ($5>m[5]){ split($0,m) } END{ print m[5], m[6], m[9] }') )

$ declare -p arr
declare -a arr=([0]="-3" [1]="is" [2]="stuff")

답변2

awk(또는 다른 것)가 쉘 스크립트에 여러 값을 반환하도록 하려면 실제로 awk 스크립트에서 해당 값을 인쇄해야 합니다.그리고이를 쉘 변수로 읽는 데 사용합니다(또는 쉘 배열이라고도 함 read).mapfilereadarray

그런데, 당신은 bash를 사용하고 있으므로, bash를 실행 help read하거나 help mapfile이에 대해 자세히 알아보세요.

예를 들어, 다음 용도 read프로세스 교체값을 쉘 변수로 읽고 다음 을 수행합니다 $max5.$max6$max9

#!/bin/bash

read -r max5 max6 max9 < <(bash myScript.sh |
  awk '$5 > max5 { max5=$5; max6=$6; max9=$9 }
       END { print max5, max6, max9 }' )

echo "max5 = $max5"
echo "max6 = $max6"
echo "max9 = $max9"

그런데, 저는 당신의 것이 없어서 myScript.sh더 간단한 것으로 테스트했습니다. 또한 방법이 작동한다는 것을 보여줍니다.어느공백으로 구분하여 한 줄에 3개의 값을 출력하는 프로그램 또는 함수:

$ read -r max5 max6 max9 < <(awk 'BEGIN{print 1,2,3}')
$ printf "%s\n" "$max5" "$max6" "$max9"
1
2
3

관련 정보