SJISのCSVからシェルで集計するまでの流れ
CSVのデータを集計を、シェルでさくっと終わらせたいときのためのメモです。
まずは文字コードを変換
だいたいCSVはSJISであることが多いので、シェルで正しく処理できるように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] } } '