Ambivalent Wanderer

脳科学(認知科学)、ロボット、現代美術。興味があること、考えたことについて細々と書いています。

エクセルで大量のデータを処理する簡単な言語について(AWKの紹介)

こんにちは、Mikenerianです。


久しぶりにプログラミング系記事書きます。

AWK(オーク)というプログラミングを知っている方はどのくらいいるのでしょうか。
私は先輩に教えてもらうまで全く知りませんでした。
この言語、知名度は低い(?)ですがエクセル(.csv形式)ファイルの処理にかなり強く、覚えてしまえばとても簡単なので使い勝手が良いです。
しかもmacユーザーなら環境構築の必要もありません。なんとターミナルで"awk"と入力するだけですぐに使えます。

というのもどうやらこの言語はUNIX上で開発されたようです。
UNIXの歴史について詳しくは、wikiが意外と親切です。
Unixの歴史 - Wikipedia


AWKが役立つ場面としては、エクセル上の大量データから特定のものを抜き出したいとき、
同じ処理をエクセルで何度も実施したいとき、
などです。


本記事ではAWKの基本的使い方から、エクセルでの具体的活用法までを紹介します。


f:id:Mikenerian:20180803225421j:plain:w600
※画像は木のオーク(oak)です。

オークの起動・実行方法


まず、.awk形式のソースコードを作成します。
自分の場合、ソースコードの作成はAtomを使用していますが、他のテキストエディタでも問題ないと思います。

awkのファイルは、基本的に以下のように書きます。

BEGIN {最初の処理}

$n == "◯◯"{n列目が◯◯だったときの処理}

END{最後の処理}


ここで、「最初の処理」、「n列目が◯◯だったときの処理」、「最後の処理」には何かしらの命令が入ります。
例えば、"print x"などです。
その辺りの書き方は他の言語とあまり違っていません。if文やfor文も使用可能です。

基本的にawkは1行目から最後の行まで順番に処理をしていくため、BEGINで処理が始まる前の命令(変数の定義など)を書きます。
$nが列数を指定するための書き方です。例えば2列目が「りんご」と書かれている行だけ処理したければ、$2 == "りんご"{命令文}と書けます。
ENDで、全行の処理が終了してからの命令を指定します。


この.awk形式のファイルを実行するには、ターミナルを起動するだけでOKです。


以下のように入力すれば、実行できます。($はターミナルの先頭文字で、実際に入力はしません)

$ awk -f ◯◯.awk ●●.csv

◯◯でawkのパスとファイル名、●●でcsvのパスとファイル名を指定します。

ちなみにexcelはデフォルトでの保存形式が.xlsxなどのため、「ファイルを別名で保存」から.csvを指定してあげます。


またこれだけでは上手くいかないことがあり、きちんとコンマ区切りであることを示す必要があります。

$ awk -F , -f ◯◯.awk ●●.csv

このように、-Fで区切り文字を指定することができます。




ファイル処理の例

今回は、以下のようなcsvファイルで、nameがcの商品がいくつあり、cのsize合計がいくつにあるか算出するプログラムを書きます。
※この程度の単純な作業ならエクセルで直接処理したほうが早い気もしますが…あくまで例です。

No. name size
1 a 2
2 b 3
3 c 5
4 b 2
5 a 2
6 d 1
7 b 2
8 b 1
9 c 2
10 a 3


awkプログラムは以下のようになります。
# 以下はコメントアウトです。

BEGIN{
    sum_c = 0;    # "c"と書かれた行数をカウントする変数
    size_c = 0;    # size合計をカウントする変数
}

$2=="c"{
    sum_c += 1;
    size_c += $3;    # 3行目の数を追加
}

END {
    print "cの数 " sum_c;
    print "cのsize合計 " size_c;
}


出力結果は以下のようになります。

cの数 2
cのsize合計 7


単純なプログラムですが、awkの利点は軽いことであり、数千行のファイルなどでその真価が発揮されるのではないかと思います。

macユーザーの方はぜひ実践してみてください!