今回のawk版は関数を使って構築します。
AWKはUNIXでは古くからある言語なのですが、あまり知られていない言語でもあり、よく外部セミナーなどで、社外の人と話す時に「ハァ?」と言われるんですが、これほどパワフルなスクリプト言語もないだろう。
しかもOS依存していてIOに強いなんて、知らないほうが損をするレベルである。
毎回AWK言語に関して、この手の話をしますが、相変わらず人気が無い言語であることもよくわかる。
そして、コマンドラインのワンラインコマンドという認識で使われているレベルが極めて多いことも事実かもしれない。
でも、そんなことにはめげずに、選択ソートをコーディングしてみたいと思います。
ソースコード
BEGIN{
FS=",";
}
function selectSort(numbers_base){
# 受け渡しに配列が使えないので、文字列分解する
split(numbers_base , numbers , ",");
# 数値配列を最初から順番に評価していく
for(i=1; i<=length(numbers)-1; i++){
# 最小値の格納変数(最初は評価対象数値を入れておく)
min = numbers[i];
# 入れ替え対象番号用変数
num = i;
# 評価番以降の一番低い数値を取得
for(j=num+1; j<=length(numbers); j++){
if(min > numbers[j]){
num = j;
min = numbers[j];
}
}
# 評価番号と入れ替え番号が同じ場合は入れ替えなしとして処理無し
if(num == i){continue;}
# 評価番号と入れ替え番号の値を入れ替える
numbers[num] = numbers[i];
numbers[i] = min;
}
# joinが無いので、文字列を繋げる
res = numbers[1];
for(i=2; i<=length(numbers); i++){
res = res","numbers[i];
}
return res;
}
{
res = selectSort($0);
print res;
}
数値のデータ群
10,2,12,7,16,8,13
実行
awk -f selectSort.awk selectSort.awk.csv
2,7,8,10,12,13,16
$ echo "10,2,12,7,16,8,13" | awk -f selectSort.awk
2,7,8,10,12,13,16
解説
ソースコードは相変わらずPHPのモノをそのままローカライズである。
AWKの最大の欠点は、配列の扱いがイマイチであるという事で、関数の文字受け渡しで配列を使うと、痛烈に実感する事になる。
具体的に言うと、関数の受け渡しに配列を使うと、送られてきた変数は、文字列になる。
そして、配列のままreturnするとエラーになるので、わざわざ文字列に直してあげないといけない。
今回は、なんとなく、その都度コードを書いて対応しているが、これはこの企画の為になんとか便利関数を作っておかねばいかんだろう。
だが、今回はそんな対応はせずに、次回以降に回すとしよう。
これが、「ザ・後回し!」である。
仕事ではよく使う手なので、スピード優先の現場ではオススメしたい。
関連リンク
いろいろなプログラム言語でアルゴリズム学習
0 件のコメント:
コメントを投稿