blog

UnixのcatコマンドでCSVファイルを結合する

    • Ryuichi Nonaka
    この記事は書かれてから1年以上経過しており、内容が古い場合があります。

    たとえばWeb Master Toolsでチェックできるキーワード別の検索順位の推移を見たいとき、Web Master Toolsでもキーワード単位であれば確認できますが、まとめてみることはできません。そこでWeb Master Toolsからエクスポートできる検索クエリのCSVデータをTableau等のツールで分析する際、日毎に取得したCSVファイルを1つにまとめて分析に使います。

    そんなときにエクセルやテキストエディタでコピペするとかめんどくさいので調べてみたらcatという便利なLinuxコマンドがありました。

    catコマンドとは

    cat(wikipedia)はconcatenateの略で結合を意味しますがUnixコマンドではファイルの中身を表示するのに使ったりもします。

    cat(カット)はUNIXの標準コマンドであり、ファイルを連結させたり表示したりするのに用いる。catは連結することを意味する「catenate」の略である。

    サンプル

    サンプル用にWeb Master ToolsからダウンロードしたCSVを日付別で保存します。

    • 20141201.csv
    • 20141202.csv
    • 20141203.csv

    CSVの中身

    検索キーワード,表示回数,クリック数,CTR,平均掲載順位
    nodebrew,34,4,12%,5.1
    vccw,33,4,12%,4.0
    could not find gem 'spring (>= 0) ruby' in the gems available on this machine.,5,4,80%,2.8
    byword,13,2,15%,5.0
    vmware fusion 5 yosemite,6,2,33%,8.5
    bundle exec,25,1,4%,7.7
    symbol not found: _sslv2_client_method,13,1,8%,6.8
    /dev/vmmon を開くことができませんでした:ファイルまたはディレクトリがありません。,8,1,12%,2.0
    unbrewed header files were found in /usr/local/include.,6,1,17%,5.2
    markdown エディタ,6,1,17%,12
    vmware fusion 5.05 yosemite,6,1,17%,4.0
    yosemite virtualbox,5,1,20%,25
    vmware fusion 5.0.5 yosemite,4,1,25%,4.8
    yosemite vmware fusion 5,3,1,33%,7.0
    bundle exec 省略,3,1,33%,3.0
    sketch swatches,3,1,33%,1.0
    wget ディレクトリ,2,1,50%,10
    gulp プラグイン,2,1,50%,47
    ...
    

    ファイルを結合する

    catコマンドを使ってファイルの中身を結合し、201412.csvというファイルに出力します。結合自体はとても簡単です。

    $ cat 201412*.csv > 201412.csv
    

    行の先頭に日付を追加する

    ただ結合しただけではデータとして使えないため、sedコマンドを使って個別のファイルのレコードに日付の情報を付加します。20141201.csvの場合は以下のようになります。

    $ LC_ALL=C sed -i -e 's/^/2014\/12\/01,/g' 20141201.csv
    

    日付が追加されると以下のようになりますが先頭行の項目名も日付になってしまうためこれも置き換えます。

    2014/12/01,検索キーワード,表示回数,クリック数,CTR,平均掲載順位
    2014/12/01,nodebrew,34,4,12%,5.1
    2014/12/01,vccw,33,4,12%,4.0
    2014/12/01,could not find gem 'spring (>= 0) ruby' in the gems available on this machine.,5,4,80%,2.8
    2014/12/01,byword,13,2,15%,5.0
    2014/12/01,vmware fusion 5 yosemite,6,2,33%,8.5
    2014/12/01,bundle exec,25,1,4%,7.7
    2014/12/01,symbol not found: _sslv2_client_method,13,1,8%,6.8
    2014/12/01,/dev/vmmon を開くことができませんでした:ファイルまたはディレクトリがありません。,8,1,12%,2.0
    2014/12/01,unbrewed header files were found in /usr/local/include.,6,1,17%,5.2
    2014/12/01,markdown エディタ,6,1,17%,12
    2014/12/01,vmware fusion 5.05 yosemite,6,1,17%,4.0
    ...
    

    先頭行の項目名のラベルを「日付」にする

    これも同様にsedコマンドを使います。

    $ LC_ALL=C sed -i -e '1s/^2014\/12\/01/日付/g' 20141201.csv
    

    項目名が日付に変わりました。

    日付,検索キーワード,表示回数,クリック数,CTR,平均掲載順位
    2014/12/01,nodebrew,34,4,12%,5.1
    2014/12/01,vccw,33,4,12%,4.0
    2014/12/01,could not find gem 'spring (>= 0) ruby' in the gems available on this machine.,5,4,80%,2.8
    2014/12/01,byword,13,2,15%,5.0
    2014/12/01,vmware fusion 5 yosemite,6,2,33%,8.5
    2014/12/01,bundle exec,25,1,4%,7.7
    2014/12/01,symbol not found: _sslv2_client_method,13,1,8%,6.8
    2014/12/01,/dev/vmmon を開くことができませんでした:ファイルまたはディレクトリがありません。,8,1,12%,2.0
    2014/12/01,unbrewed header files were found in /usr/local/include.,6,1,17%,5.2
    2014/12/01,markdown エディタ,6,1,17%,12
    2014/12/01,vmware fusion 5.05 yosemite,6,1,17%,4.0
    2014/12/01,yosemite virtualbox,5,1,20%,25
    2014/12/01,vmware fusion 5.0.5 yosemite,4,1,25%,4.8
    2014/12/01,yosemite vmware fusion 5,3,1,33%,7.0
    

    この方法は全然スマートな方法じゃないと思うのでもっと手軽にやる方法があれば教えてください。

    コメント・フィードバック