Awkでは自作の関数を作成して使うことができます.
{myprint($1,$2)}
function myprint(a,b, c){
c = a*b;
print c;
}
これは第一項目と第二項目を掛けたものを出力しています.ここでmyprintは3つの仮引数があるにも関わらず,実引数は2つしか渡していません.これはAwkが局所変数が使えない為,自作の関数内でローカルに使う変数を扱おうと思って,
{myprint($1,$2)}
function myprint(a,b){
c = a*b;
print c;
}
こうやってしまうと,確かに動くのですが,変数Cはグローバルになりますので,例えば,
{c=$1;myprint($1,$2);print c}
function myprint(a,b){
c = a*b;
print c;
}
としたときに呼び出しもとのcの値が変わってしまいます.そのためローカルで使いたい分の変数を余分に仮引数として宣言しておきます.
{c=$1;myprint($1,$2);print c}
function myprint(a,b, c){
c = a*b;
print c;
}
こうすれば呼び出し元の値は変わりません.また,仮引数のcの前に沢山のスペースが入っているのは実際に関数を使う際に実引数を与える部分と,ローカルで使う分が分かるようにするためです. C言語同様引数には値渡しとなります.
また値を返したり分岐したり再帰も行えます.
{print fact($1)}
function fact(a){
if(a==1)return 1;
return a*fact(a-1);
}
ちゃんと再帰ができています.