두 개의 필드로 파일 내용을 그룹화하고 세 번째 필드를 합산합니다.

두 개의 필드로 파일 내용을 그룹화하고 세 번째 필드를 합산합니다.

아래에 파일이 있는데 세 번째 필드를 합산하여 그룹의 첫 번째 및 두 번째 필드를 기준으로 계산하고 싶습니다.

문서

 AAA~111~2
 BBB~111~2
 AAA~111~1
 AAA~111~3
 AAA~222~2

예상 출력

 AAA~111~6~3
 BBB~111~2~1
 AAA~222~2~1

지금까지 내 코드는 세 번째 열만 요약했습니다.

 awk 'BEGIN { FS=OFS=SUBSEP="~"}{arr[$1,$2]+=$3 }END {for (i in arr) print i,arr[i]}' File

답변1

합계를 추적하는 것과 동일한 방식으로 간단히 개수를 추적할 수 있습니다.

$ awk -F'~' 'BEGIN { SUBSEP = OFS = FS } { s[$1,$2] += $3; ++c[$1,$2] } END { for (i in s) { print i, s[i], c[i] } }' file
AAA~111~6~3
BBB~111~2~1
AAA~222~2~1

datamash간단한 기록 형식의 데이터에 대해 합계 등과 같은 기본 사항을 계산하는 방법을 아는 GNU와 같은 도구를 선택할 수도 있습니다.

$ datamash -t '~' -s groupby 1,2 sum 3 count 3 <file
AAA~111~6~3
AAA~222~2~1
BBB~111~2~1

여기서 datamash입력은 행 기반 레코드에서 물결표로 구분된 필드로 처리되어야 합니다. 각 그룹의 모든 레코드에 대한 세 번째 필드의 합계와 각 그룹의 레코드 수로 구성된 두 개의 새 필드를 추가하는 동안 처음 두 필드의 데이터를 그룹화합니다.

입력 데이터가 처음 두 필드를 기준으로 정렬된 경우 이 -s옵션을 제거할 수 있습니다.

관련 정보