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); }
ちゃんと再帰ができています.