[アルゴリズム] バブルソート(awk編)

バブルソート第5回はUNIXスクリプトでおなじみの「AWK言語」でございます。
AWKと聞くと、コマンドラインで便利にプログラミングをすることができるツールとしか理解されていないようですが、実はAWKはかなりパワフルなスクリプト言語で、OSレベルのIOを実行することもでき、スクリプト言語なのに、そうとうのパフォーマンスを出すことができるという事を知っていると、使わずにはいられないのではないでしょうか?
そんなわけで、AWKを知らない人などに便利さを理解してもらうべく扱いたいと思います。
前回までのおさらい
[アルゴリズム] バブルソート(Javascript編)
[アルゴリズム] バブルソート(PHP編)
[アルゴリズム] バブルソート(Python編)
[アルゴリズム] バブルソート(Shell編)
そろそろバブルソートの説明もいらなくなってきたと感じたので、概要は割愛。
この下位から読み始めて知らない人は、過去記事を参照くださいませ。
ソースコード
AWKはデータファイルを読み込んで処理を行う使い方をするので、今回対象のデータは「numbers.csv」というデータファイルを作って対応します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
BEGIN{ FS=","; } { #print $0; while(1){ flg = 0; for( i=1; i<NF; i++ ){ num1 = $i; num2 = $(i+1); if(num1 > num2){ $i = num2; $(i+1) = num1; flg++; } } if(flg==0){break} } print $0; } |
1 |
10,2,12,7,16,8,13 |
解説
awk言語の配列は少し特殊で[1]から開始されます。
殆どの言語が配列は[0]から開始されるのに、awkの[0]は配列の全体参照が行われるという非常に特殊な仕様となっているので、気をつけて使いましょう。
BEGIN処理
読み込まれるcsvファイルの分割文字列を指定します。
1 |
FS=","; |
この場合は、,(カンマ)が区切り文字になり、環境変数に入ります。
環境変数の取り出し
awkもjavascriptと同じぐらい変数の型扱いにルーズです。
今回取り込まれた文字(環境変数)に入れられた値を取り出すには、$1,$2という風に、$nで取り出しますが、
for文で回している中で$iで順番に参照することができます。
決して$[i]というような取り出し方ではエラーになるので、構文を覚えておきましょう。
print $0
$1~**の環境変数がまとめて入っている器が$0になります。
最後の行でprint $0として一括出力しています。
結果
1 2 |
$ awk -f bubbleSort.awk numbers.csv 2 7 8 10 12 13 16 |
awkコマンドは、-fオプションでプログラムファイルを読み込み、最後の受け渡し値でデータファイルのパスを入力することで実行されます。
複数行あっても、かなりの速度で実行できる上、それをファイルに書き出す処理なども、非常に高速に行えます。
まとめ
AWKは個人的に非常に便利に使っていて、SQLいらずとして、csvデータファイルを直接awk言語でデータ扱うすることで慣れるとSQLよりも高速にデータ管理はファイル単位で行えるので、そういった使い方をするのが好きな言語です。
ただし、仕事で使う場合は、他の人の学習コストが少し高くつくため、便利関数などを作っておいて対応することをオススメします。