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を追加した後、入力レコードをそのまま出すだけだからと、たくさんある出力フィールドを「$」と「,」で明示して書いてたのをやめて省略してみたら、自分の思ったとおりに動作しなくなった、というオチです。こう動いてほしいという希望や思い込みでコードを書かないよう気をつけます。