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]
음수가 올바르게 처리되어야 합니다.