AWK覚え書き(2)
- 変数はアクションをまたがって使用できるようです。宣言順もなさそう。*1
> echo aiueo | awk 'BEGIN {hoge=5}; {print ++hoge}; END {print ++hoge}' 6 7 > echo aiueo | awk '{print ++hoge}; END {print ++hoge}; BEGIN {hoge=5}' 6 7
関数の戻り値に配列を使う場合
- 関数の戻り値に配列を使ったら、"bad type variable" エラーが出ました。
- 多分、数値か文字列しか返せない。
- 仮引数とローカル変数の区別がない。
- ローカル変数も仮引数として列挙する。
- そのため、見て判るように多量のスペースで区切るのがマナーみたいです。
- ローカル変数も仮引数として列挙する。
- 引数で渡す場合、数値 / 文字列は値渡しで、配列は参照渡しっぽい。*2
結論:out引数でなんとかする。
マルチバイト文字の操作
- substr(string, start [, length]) のlengthはバイト長で指定しないと駄目っぽい。
- hoge["\x83\x41"]とか書いても大丈夫。
- バイト置換用に外部ファイル用意してなんとかしようかと思ったんですが、16進文字列からバイトに変換する方法がすぐに思いつかなかったのであきらめました…。16進文字→10進数値→sprintf("%c", ...)とかなんでしょうか???
フィールドの書き換え
- 変更したいフィールドだけ修正して、引数なしのprint*3を実行すると、元と同じフォーマットで出力されるみたいです。
カンマ使わないのでOFS不要←大嘘。出力のフィールド・セパレータは、ちゃんとOFSどおりになるようです。
こんな感じ
{ $1 = foo($1) $2 = bar($2) print }
さらなる応用編
あらかた片付いたのでこれ以上凝った使い方は当分必要なさそうですが、その日に備えてメモ。
*1:ただし、BEGINパターンを先頭に、ENDパターンを末尾に書く事が、可読性の面から推奨されているようです。The GNU Awk User's Guide - パターンとアクション参照。
*2:値呼び出し(call by value)と参照呼び出し(call by reference)が正式な名称みたいです。The GNU Awk User's Guide - ユーザー定義関数を参照。
*3:print $0と同様。The GNU Awk User's Guide - 出力を行う参照