awk 그룹 col1의 날짜 연도 및 월, col2의 그룹 합계

awk 그룹 col1의 날짜 연도 및 월, col2의 그룹 합계

명령줄 스크립트를 사용하여 아래 데이터를 그룹화하고 합산하는 방법에 대한 아이디어가 있습니까?

2018-02-01  10
2018-02-03  12
2018-03-01   1
2018-03-01  12
2018-04-12   9 
2019-01-12 213

위 데이터 세트의 예상 결과

2018-02  22
2018-03  13
2018-04   9
2019-01 213

답변1

이 시도

$ awk '{a[substr($0,0,7)]+=$2}END{for(b in a){print b,a[b]}}' myfile
2018-02 22
2019-01 213
2018-03 13
2018-04 9
$

정렬하려면 다음을 추가하세요.sort

$ awk '{a[substr($0,0,7)]+=$2}END{for(b in a){print b,a[b]}}' myfile | sort
2018-02 22
2018-03 13
2018-04 9
2019-01 213
$

답변2

또 다른 awk방법:

$ awk -F'[- ]' '{a[$1"-"$2]+=$NF}END{for(i in a){print i,a[i]}}' file | sort
2018-02 22
2019-01 213
2018-03 13
2018-04 0

또는 펄:

$ perl -lne '/(.*)-.+ (\d+)/; $k{$1}+=$2 }{ print "$_ $k{$_}" for sort keys(%k)' file 
2018-02 22
2018-03 13
2018-04 9
2019-01 213

답변3

다음은 외부 바이너리를 사용하지 않고 출력을 정렬하는 또 다른 방법입니다 sort. 예를 들면 다음과 같습니다.

awk '{arr[substr($0,0,7)]+=$2}END{a=asorti(arr,sort); for(i=1;i<=a;i++) print sort[i], arr[sort[i]]}' infile.

답변4

사용csvsql에서 csvkit:

csvsql -d' ' -H --tables file --query "
  select substr(a,1,7) as the_date,sum(b)
  from file
  group by the_date;
" <(tr -s ' ' < file)

산출:

the_date,sum(b)
2018-02,22
2018-03,13
2018-04,9
2019-01,213

관련 정보