はじめに
仕事柄とてつもなく大きなCSVファイルを触ることがあります。たとえば毎時刻の状態値をCSVに格納したデータが10年分あって、それを変化のわかりやすいグラフに書き直すためにデータを間引くような作業がしょっちゅうあります。
とはいっても作業環境が標準的なWindowsパソコンで新しいソフトのインストールが出来ないようなシーンでは手作業でやらなければならないという非効率な業務フローだったため、awkを利用した短縮テクの記事をまとめることにしました。
インストール
もちろん生のWindowsのシステムではawkを利用することはできません。そこでgawkからダウンロードします。または最近はBusyBoxなどがあるのでこちらでコマンド群を一括インストールしてもいいかもしれません。そのあたりはお好みで。
もちろん環境パスが通っているWindowsフォルダにおいてもいいのですが、あまりシステムを汚したくないのでProgram Fileに他のアプリケーション同様おいておき、そこに対してパスを通しておくのがいいのではないでしょうか。
awkって何よ
awkはsedやgrepと並んでLinuxなどのUNIX系システムでは頻繁に用いられるコマンドの一つです。sedが文字列の置換、grepが文字列の検索などに使われるのに対して、awkはもっと突っ込んだテキストパターンマッチングで用いられます。
行を抜き出そう
手始めによくありそうなシチュエーションの、CSVファイルから必要な行だけ取り出すのをやってみます。1ただしawkはテキストファイルしか扱うことができませんので、Excelファイルなどは扱うことができません。その場合はPythonなどを持ち出したほうが手っ取り早いでしょう。
gawk /01:00/'{print $0}' test.csv
このコマンドを実行することで1:00のデータのみを取り出すことができます。しかも爆速。
それでは次です。
列の抜き出し
行を取り出すことができたら次は行ですよね。
gawk '{print $1}' test.csv
おそらくこの記事を読まれるような方であれば常識かもしれませんが、シングルクォーテーションで途中囲んでいるのはオプションに半角スペースを含んでいるからです。念の為。
さて、この行の抜き出しですが、抜き出すだけではなく四則演算もすることができます。
gawk '{print $1+$2}' test.csv
偶数列のみの抜き出し
このあたりまでが基本動作です。思ったより全然難しくないですよね?それではもうちょっと複雑なことやってみます。
gawk 'NR % 2 == 0 {print $0}' test.csv
これは最初に出てきた行の抜き出しの応用です。先程は行、つまりレコードを1つずつ調べていってデータを抜き出したわけですが、今度はNRという組み込み変数に四則演算を駆使して抜き出しました。とはいってもExcelの表でRow関数とMod関数を使いながらフィルタリングしたのと大差はないわけですが、どちらが見た目や考え方がスッキリしているかというとその差は歴然です。
組み込み変数についてはこちらの記事が詳しいです。
最後に
大きな帳票データの整理の作業は多かれ少なかれどの職種でもしている作業だと思いますが、このあたりをスムーズかつスマートにしようとするとPandasやその他のデータベース管理ソフトを使いたくなります。確かにawkではExcel同様欠損値の補間やクレンジングといった作業は自動でしてくれないわけですが、データの整理の作業をコマンドラインで「誰がやっても、同じ結果を、高速で得られる」というメリットはかなり魅力的なのではないでしょうか。
それでは良いawkライフを。
-
日常的にデータベースに慣れている方だと列と行について選択と射影と表現したほうがわかりがいいのかもしれませんが、今回は列と行というExcel的表現で進めます。 ↩