데이터 세트는 다음과 같습니다
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
가 아닌 가장 큰 것만 출력합니다 .b
e
원하는 출력은
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 }
.