![awk를 사용하여 텍스트 파일의 모든 최대값을 인쇄합니다.](https://linux55.com/image/213470/awk%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%85%8D%EC%8A%A4%ED%8A%B8%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EB%AA%A8%EB%93%A0%20%EC%B5%9C%EB%8C%80%EA%B0%92%EC%9D%84%20%EC%9D%B8%EC%87%84%ED%95%A9%EB%8B%88%EB%8B%A4..png)
한 열의 최대값을 모두 출력하려고 합니다.
그래서 입력은 다음과 같습니다
John. Marketing. 5000.
Marcus. Manager. 9500.
Jason. SW 9500.
Cindy. Developer. 6000.
내가 원하는 출력은
name: Marcus, sal: 9500.
name: Jason, sal: 9500
지금까지 내 코드는
BEGIN {a=0}
{
if ($3> a)
max=$3;
output=$1
}
END{
print "name: ", output, "sal:", max
}
답변1
파일을 두 번 구문 분석해야 하며, 먼저 최대값을 찾은 다음 해당 줄을 인쇄해야 합니다. 예를 들어( max
양수라고 가정):
파싱.awk
NR == FNR && $3 > max { max = $3 }
NR != FNR && $3 == max
다음과 같이 실행하세요:
awk -f paste.awk infile{,}
{ print "name:", $1, "sal:", $3 }
형식을 변경 하려면 마지막 줄에 추가하세요 parse.awk
. 출력은 다음과 같습니다.
name: Marcus. sal: 9500.
name: Jason. sal: 9500.
답변2
awk 스크립트를 사용하면 다음을 수행할 수 있습니다.
tst.awk
!max || $3 > max {max=$3; delete array}
$3 == max {array[$0]="name:" OFS $1 OFS "sal:" OFS $3}
END{
for(key in array){
print array[key]
}
}
그게 다야 :
- 존재하지 않거나 설정된 것
max
보다 작으면$3
배열을 삭제합니다.max
$3
array
- 같으면 출력을 배열에 저장합니다
$3
.max
END
스크립트 끝에서array
인쇄된 각 키 에 대해
값 목록이 max
너무 크지 않은 경우 이 스크립트를 사용할 수 있습니다. 그렇지 않으면@토르의 답변더 나은 해결책이 될 수도 있습니다.