다음과 같은 파일이 있습니다.
1 UA
2 GB
3 UA
3 UA
2 US
1 UA
4 US
두 번째 열로 그룹화하고 첫 번째 열로 합계를 계산하는 방법은 무엇입니까? 따라서 출력은 다음과 같아야 합니다.
8 UA
6 US
2 GB
답변1
그리고 GNU awk
:
$ awk 'BEGIN{PROCINFO["sorted_in"] = "@val_num_desc"}
{a[$2]+=$1} END{for(k in a) print a[k], k}' ip.txt
8 UA
6 US
2 GB
바라보다gawk 매뉴얼: 미리 정의된 배열 스캔 순서 사용정렬 옵션에 대해 자세히 알아보세요.
그리고 perl
:
perl -lane '$h{$F[1]}+=$F[0]; END{print "$h{$_} $_" for
sort {$h{$b} <=> $h{$a}} keys %h}' ip.txt
답변2
GNU 사용 datamash
:
$ datamash -W -s -g 2 sum 1 <file
GB 2
UA 8
US 6
공백을 필드 구분 기호로 처리하고, 두 번째 필드의 입력을 정렬하고, 이 필드에서 그룹화하고, 각 그룹의 첫 번째 필드를 합산합니다.
awk '{ print $2, $1 }'
열을 교환하고( datamash
항상 출력에서 그룹화된 열을 먼저 작성) sort -nr
예제와 같이 출력을 내림차순으로 정렬하려면 출력을 파이프하십시오.
$ datamash -W -s -g 2 sum 1 <file | awk '{ print $2, $1 }' | sort -nr
8 UA
6 US
2 GB
요약 하자면 awk
:
$ awk '{ sum[$2] += $1 } END { for (i in sum) print sum[i], i }' file
8 UA
2 GB
6 US
sort -nr
위와 같이 정렬하려면 전달하세요.