여러 파일에서 데이터를 수집하여 단일 요약 파일에 덤프하고 있습니다.
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
)을 사용하여 데이터를 수집할 수 있나요 ?