awkコマンドのOFSが無効になるとき

懲りずにawkコマンドネタ。問題です。以下のようなファイル(input.dat)があります。

1,2,3,4,5
a,b,c,d,e

このファイルに対して次のようにawkコマンドを使うとどのように出力されるでしょうか?

awk 'BEGIN{FS=",";OFS="|"}{print}' input.dat

誤回答

1|2|3|4|5
a|b|c|d|e

正解

1,2,3,4,5
a,b,c,d,e

OFSの指定を無視して入力レコードがそのまま出力されます。

アクションは`{' と`}'に囲まれている。アクションかパターンのどちらかを省略する事ができる(もちろん両方を省略するという事はできない)。パターンが省略されると、全ての入力に対してアクションが実行される。アクション部が省略されると次に挙げるものと同じ動作を行う。

{ print }

つまり、入力された行をそのまま出力する。

http://www.kt.rim.or.jp/~kbk/gawk/gawk_19.html

誤回答のように出力したい場合は、

awk 'BEGIN{FS=",";OFS="|"}{print $1,$2,$3,$4,$5}' input.dat

のように書く必要がありますね。出力フィールドが多いときに面倒ですね。今回は、フィールドセパレータを変更しなくちゃいけなくなってBEGINにOFSを追加した後、入力レコードをそのまま出すだけだからと、たくさんある出力フィールドを「$」と「,」で明示して書いてたのをやめて省略してみたら、自分の思ったとおりに動作しなくなった、というオチです。こう動いてほしいという希望や思い込みでコードを書かないよう気をつけます。