목록에서 여러 항목의 총 개수를 계산하는 방법

목록에서 여러 항목의 총 개수를 계산하는 방법

저는 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그룹화하기 전에 입력을 정렬하는 옵션을 추가하세요.

관련 정보