BASH를 사용하여 모든 주식의 최고 가치를 출력하는 방법

BASH를 사용하여 모든 주식의 최고 가치를 출력하는 방법

데이터 세트는 다음과 같습니다

name score
a 10 
b 20 
c 5 
d 15 
e 20

목표는 가장 높은 점수를 가진 모든 이름을 출력하는 것입니다. 공통 최대 점수를 갖는 이름이 여러 개인 경우 모든 이름을 출력합니다. 가능하다면 grep, sort, cut, head만 사용하세요.

현재는 합계 tail -n +2 sources.txt | sort -k 2,2nr | cut -d ' ' -f 1 | head -1가 아닌 가장 큰 것만 출력합니다 .be

원하는 출력은

b
e

답변1

$ awk 'FNR == 1   { next };
       FNR == NR  { if ($2 > max) { max = $2 } ; next };
       $2  == max { print $1 }' sources.txt sources.txt
b
e

이 awk는 한 줄로 입력 파일을 읽습니다( sources.txt).두 배(그래서 명령줄에서 두 번 지정해야 합니다.) 처음에는 두 번째 필드($2)의 최대값을 찾아 변수에 저장하고 max, 두 번째에는 $2가 같을 때 첫 번째 필드($1)를 인쇄합니다 max.

두 개의 내장 awk 변수를 사용합니다. FNR항상 현재 파일의 줄 번호와 같고, NR모든 입력의 현재 줄 번호(누적 합계)와 항상 같습니다. 따라서 이면 FNR == NR첫 번째 파일을 읽고, 이면 FNR != NR입니다.아니요첫 번째 파일을 읽습니다. 빈 파일은 전혀 계산되지 않으므로 입력 파일 중 하나라도 비어 있으면 제대로 작동하지 않습니다. 빈 파일에는 줄이 없으므로 계산할 항목이 없습니다.

두 번 모두 입력의 첫 번째 줄(헤더 줄)을 무시합니다 FNR == 1 { next }.

관련 정보