Linux 파일의 첫 번째 열을 통합하고 두 번째 열에 숫자를 추가합니다.

Linux 파일의 첫 번째 열을 통합하고 두 번째 열에 숫자를 추가합니다.

여러 파일에서 데이터를 수집하여 단일 요약 파일에 덤프하고 있습니다.

cat *files* | sort -u > final.rpt
a 1
a 5
a 6
b 2
b 3 
b 0
c 1
c 7

첫 번째 열의 문자열을 기반으로 고유화하고 두 번째 열의 해당 문자열에 해당하는 모든 숫자를 합산하려면 어떻게 해야 합니까? 위의 예에서 예상되는 출력은 다음과 같습니다.

a 12
b 5
c 8

답변1

다음과 같은 작업이 수행됩니다.

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

아이디어는 연관 배열을 사용하고 두 번째 열의 값을 합산하는 것입니다.

답변2

사용 datamash:

$ datamash -sW sum 2 -g 1 <file

그러면 첫 번째 필드 sum뿐만 아니라 두 번째 필드도 계산됩니다 .groupby


사용 Miller:

$ mlr --nidx stats1 -a sum -f 2 -g 1 file

정렬되지 않은 파일에 다음과 같이 두 개의 필드만 있다고 가정합니다.

a 1
a 5
a 6
b 2
b 3
b 0
c 1
c 7
a 1

다음 명령은 먼저 파일을 정렬한 다음 합계를 계산합니다.

$ mlr --nidx uniq -f 1,2 then \
stats1 -a sum -f 2 -g 1 file

답변3

완전성을 위해 다음은 O(1) 메모리 사용 솔루션입니다.

awk 'NR>1 && $1!=prev {print prev, sum;sum=0} {sum+=$2;prev=$1} END {print prev, sum}' < final.rpt
a 12
b 5
c 8

설명: $1이 변경된 각 새 레코드에 대해 결과를 인쇄하고 합계를 재설정합니다. 또한 파일 끝에 결과를 인쇄하지만 시작 부분에는 인쇄하지 않습니다(NR>1). 이 코드는 연관 배열 버전에 비해 약간 번거롭습니다.

답변4

... | sort | uniq -c >final.rpt(를 사용하는 대신 ... | sort -u >final.rpt)을 사용하여 데이터를 수집할 수 있나요 ?

관련 정보