저는 bash와 그 구문을 처음 접했기 때문에 전체 하드 드라이브 인벤토리 수를 얻기 위해 목록을 정렬하는 방법을 알고 싶습니다.
예는 다음과 같습니다. 우리는 다양한 공급업체와 모델의 많은 서버와 하드 드라이브를 보유하고 있습니다.
이름의 발생이 아닌 숫자를 기준으로 어떻게 함께 세겠습니까?
ST8000NC0002: 8
ST900MM0168: 1
ST900MM0168: 1
ST9300603SS: 3
ST9300605SS: 4
ST9500620SS: 3
WD1003FBYX: 7
WD1500HLFS: 4
WD9001BKHG: 3
WD9001BKHG: 3
WD9001BKHG: 4
WD9001BKHG: 4
원하는 출력:
ST8000NC0002: 8
ST900MM0168: 2
ST9300603SS: 3
ST9300605SS: 4
ST9500620SS: 3
WD1003FBYX: 7
WD1500HLFS: 4
WD9001BKHG: 14
답변1
awk
바로 이것을 위해서입니다. data
첫 번째 필드( )로 인덱스된 배열( )을 채우고 두 번째 필드( )의 값을 $1
누적합니다 . $2
배열을 채운 후 간단한 for
루프를 사용하여 데이터를 출력합니다. 편의상 출력은 파이프로 연결됩니다 sort
.
awk '{data[$1]+=$2} END { for( d in data ) { print d, data[d] } }' input | sort
ST8000NC0002: 8
ST900MM0168: 2
ST9300603SS: 3
ST9300605SS: 4
ST9500620SS: 3
WD1003FBYX: 7
WD1500HLFS: 4
WD9001BKHG: 14
답변2
GNU 사용 datamash
:
datamash -W -g 1 sum 2 < file
-W
필드 구분 기호로 공백(공백/탭) 사용(탭 대신)-g 1
첫 번째 필드의 그룹sum 2
두 번째 필드의 합계 값(그룹당)
산출:
ST8000NC0002: 8
ST900MM0168: 2
ST9300603SS: 3
ST9300605SS: 4
ST9500620SS: 3
WD1003FBYX: 7
WD1500HLFS: 4
WD9001BKHG: 14
입력이 이미 첫 번째 필드에 정렬되어 있기 때문에 이것은 잘 작동합니다. 정렬되지 않은 입력의 경우 -s
그룹화하기 전에 입력을 정렬하는 옵션을 추가하세요.