コマンドラインスクリプトを使用して以下のデータをグループ化して合計する方法についてのアイデアはありますか?
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