コピペコードで快適生活

明日使えるソースを自分のために

SJISのCSVからシェルで集計するまでの流れ

CSVのデータを集計を、シェルでさくっと終わらせたいときのためのメモです。

まずは文字コードを変換

だいたいCSVSJISであることが多いので、シェルで正しく処理できるようにUTF-8に変換します。

# 使える文字コード一覧
iconv -l

# f(from)の文字コード
# t(to)の文字コード
iconv -f SJIS -t UTF8 target.csv > _target.csv

tsvに変換する

CSVは扱いづらいのでタブ区切りに変換します。

# csv2tsv.rb
require 'csv'

fn = ARGV[0]

if fn.nil?
  puts "CSVファイル名を指定してください" 
  exit
elsif File.extname(fn) != ".csv"
  puts "CSVファイルを指定してください" 
  exit
end

fw = File.open("#{File.basename(fn, '.csv')}.tsv", 'w')
CSV.foreach(fn, 'r') do |row|
  fw.puts(row.join("\t"))
end
fw.close

puts 'created tsv_file'

実行

ruby csv2tsv.rb target.csv

awkで集計する

# 9列目が特定の値の行だけ出力
cat *.gz | gzip -dc | gawk '{if ($9 >= 500) print $0};'

# 12列目をsumして出力
cat target.tsv | gawk -F"\t" '{s += $12} END {print s}'

# 10列目でグルーピングして、12列目をsumして出力
cat target.tsv | gawk -F"\t" '
{
  count[$10]+=1
  sum[$10]+=$12
};
END {
  for (key in sum) {
    print key, count[key], sum[key]
  }
}
'