결과

결과

다음과 같은 파일이 있습니다.

paper 3
paper 6
eraser 2
pencil 9
pencil 44
pencil 1

다음과 같이 공통된 첫 번째 필드가 있는 행을 요약하고 싶습니다.

paper 9
eraser 2
pencil 54

표준 Unix 유틸리티를 사용하여 이 작업을 수행할 수 있는 귀여운 세리프가 있습니까? 훨씬 덜 표준적인 Unix 유틸리티입니다.

답변1

확인 해봐:

$ echo "$a"
paper 3
paper 6
eraser 2
pencil 9
pencil 44
pencil 1

$ awk '{a[$1]=a[$1]+$2}END{for (i in a) print i,a[i]}' <(echo "$a")
pencil 54
eraser 2
paper 9

<(echo "$a)다음으로 바꾸세요 file:

$ awk '{a[$1]=a[$1]+$2}END{for (i in a) print i,a[i]}' file

답변2

덜 표준적인 유틸리티를 사용하십시오GNU 데이터 혼합

$ datamash --whitespace groupby 1 sum 2 < file
paper   9
eraser  2
pencil  54

아니면 좀 더 간략하게

$ datamash -Wg 1 sum 2 < file
paper   9
eraser  2
pencil  54

답변3

인쇄 순서에 관심이 있다면 다음과 같이 할 수 있습니다.

perl -lane '$h{$F[0]}+=$F[1]; $h[-1+keys%h]=$F[0]; END{print "$_ $h{$_}" for @h}'

아이디어는 해시에 있는 특정 항목의 누적 합계 %h와 특정 항목이 배열에 나타나는 순서를 유지하는 것입니다 @h. 파일 끝에서 해시(키 + 값)만 인쇄하지만 @h배열에서 순서를 가져옵니다.

결과

paper 9
eraser 2
pencil 54

답변4

다음은 awk의 그다지 귀엽지 않은 oneliner입니다.

awk '{ if (prev && prev != $1) { print prev, sum; sum = 0 }; sum += $2; prev = $1 } END { print prev, sum }' < file.txt

함께 그룹화하려면 첫 번째 필드에 동일한 값이 있는 행이 필요합니다. 그렇지 않은 경우 다음을 수행할 수 있습니다 sort file.txt | awk ....

관련 정보