【シェルスクリプト】awkコマンドでcsv/tsvファイルの合計とカウントを集計し出力する
2020-04-15
例えばお店の売り上げファイル(sales.csv)があります。このファイルを読み込んでお店ごとに集計します。集計内容は1項目目にお店、2項目目にお店の数、3項目目にお店ごとの売り上げ合計とし、集計結果を別のファイル(sum.csv)として出力したいとします。
sales.csv
store,sales 札幌,20000 札幌,1000 東京,300000 東京,2000 大阪,10000
↓
sum.csv
札幌,2,21000 東京,2,302000 大阪,1,10000
awk(オーク)コマンドを使うとこういった集計も出来るのでワンライナーで書いてみたのが以下になります。
awk -F'[,]' -v 'OFS=,' 'NR >1{sum[$1]+=[$2} {count[$2]++} END {for(key in sum) {print key,count[key],sum[key]}}' /読み込むファイル > /出力ファイル
-F'[,]' -v 'OFS=,'
まずFオプションで読み込むファイルの区切り文字を指定します。カンマが入っているのでカンマ区切り=csvファイルになります。ちなみに\tとすればタブ区切りにすることも可能です。
同様にOFS=で出力ファイルの区切り文字を指定します。こちらもカンマになっていますが、\tとするとタブ区切りで出力されます。
NR >1
こう書くと読み込むファイルの1行目を無視してくれるのでヘッダーを読み込まなくなります。