【シェルスクリプト】awkコマンドでcsv/tsvファイルの合計とカウントを集計し出力する

例えばお店の売り上げファイル(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行目を無視してくれるのでヘッダーを読み込まなくなります。

 

soon
  • soon
  • 1986年生まれのjavaプログラマー。28歳の時に7年働いた販売士からプログラマーに転職をする。常駐先を転々としながら日々生きています。