쉘 스크립트에서 가장 높은 값의 컨텐츠 표시

쉘 스크립트에서 가장 높은 값의 컨텐츠 표시

Record.txt에는 다음과 같은 정보가 있습니다.

Nosi IT 3000
David HR 4000

awk 또는 작동할 수 있는 다른 도구를 사용하여 가장 높은 급여를 받는 직원의 급여를 표시하려면 어떻게 해야 합니까? records.txt에 저장된 경우. David 4000을 보여주고 싶습니다.

답변1

사용하기 쉬운 GNUdatamash:

$ datamash -Wf max 6 < record.txt | cut -f 4,6
David   4000

datamash열 6에서 가장 높은 값을 가진 행을 인쇄하고 cut관심 있는 열만 가져오는 데 사용됩니다 .

답변2

버전:

awk 'NF && $3>max {max=$3; id=$1} END {print id" "max}' records.txt

"필드가 포함된 행(= 비어 있지 않음)에서 급여가 현재 저장된 최대값(기본값 0)보다 높으면 저장된 최대값과 챔피언 이름을 업데이트합니다. 모든 행이 나타나면 처리되었습니다( = END). ID와 급여가 포함된 두 개의 변수를 덤프합니다.

속도상의 이유로 아마도 이 접근 방식을 선택할 것입니다.하지만:

sort -k 3 -n -r records.txt | head -n 1

답변3

를 사용하려면 awk제공한 예제 입력에 대해 다음이 작동해야 합니다.

awk 'NF==0 {next} !name {max=$3; name=$1} {if ($3>max) {max=$3; name=$1};} END{printf("%s : %d\n",name,max)}' records.txt

빈 줄을 건너뛰고 비어 있지 않은 첫 번째 줄의 데이터로 최대값 max과 해당 이름(변수로 표시 name, 0즉 여기서 문자열이 필요한 경우 초기화되지 않음) 을 초기화합니다. 현재 급여보다 큰 급여가 발견되면 이를 다음(비어 있지 않은) 행의 해당 값으로 바꿉니다 max. 마지막으로 이름과 값을 인쇄합니다.

더 짧은 버전, Stephen Kitt와 Alex Stragies가 제안한 대로:

awk 'NF>0 && (!name || $3>max) {max=$3; name=$1} END {printf("%s : %d\n",name,max);}' records.txt

이는 비어 있지 않은 첫 번째 행과 세 번째 열 값이 보다 큰 모든 행에 대해max 설정 및 가 동일하다는 사실을 활용합니다. 빈 줄을 건너뛰는 것을 먼저 수행하기 위한 전제 조건으로 요구하여 간단하게 통합할 수도 있습니다.namemaxNF>0

답변4

$ sort -k3,3rn file | head -n 1
David HR 4000

이는 파일을 세 번째 열의 내림차순으로 숫자별로 정렬한 다음 해당 결과의 첫 번째 행을 사용하여 선택합니다 head.

파일에서 탭을 필드 구분 기호로 사용하는 경우 -t $'\t'with 를 사용하세요 sort. 이렇게 하면 공백이 포함된 필드를 가질 수도 있습니다.

이름과 급여만 표시하려면 awk '{ print $1,$3; exit }'대신 를 사용하세요 head -n 1.

관련 정보