가장 높은 값을 가진 행만 인쇄 [중복]

가장 높은 값을 가진 행만 인쇄 [중복]

Bash 스크립트에서 다음 파일을 처리해야 합니다.

입력.txt:

host1 53
host1 123
host2 0
host1 222
host3 1
host1 85
host1 25
host1 13
host3 8
host2 90

열 2의 최대값을 기준으로 각 호스트에 대해 한 행의 결과만 얻으면 됩니다.

출력.txt:

host1 222
host2 90
host3 8

어떤 아이디어가 있나요?

답변1

GNU sort또는 호환 제품을 사용하세요.

<input.txt sort -k2rn | sort -sbuk1,1 >output.txt

답변2

GNU 가장 짧은 것datamash:

datamash -sW -g1 max 2 <file
  • -s- 그룹화하기 전에 입력 정렬
  • -W- 공백(하나 이상의 공백 및/또는 탭)을 필드 구분 기호로 사용합니다.
  • -g 1- 첫 번째 필드로 그룹화
  • max 2- 각 그룹의 두 번째 필드의 최대값을 얻기 위한 수치 연산

산출:

host1   222
host2   90
host3   8

답변3

이것은 awk의 줄입니다.

$ awk '{if (a[$1] == "" || $2 > a[$1]) a[$1] = $2} END { for (k in a) print k, a[k] }' < input.txt
host1 222
host2 90
host3 8

$1$2는 행의 처음 두 필드이고 연관 배열은 a[k]key 의 현재 최대값을 보유합니다 k. null 에 대해 테스트하면 a[$1]음수가 올바르게 처리되어야 합니다.

관련 정보