コマンドライン経由で awk 変数を設定する方法は 2 つありますか?

コマンドライン経由で awk 変数を設定する方法は 2 つありますか?

awk私は、コマンドラインで設定することによってawk変数を割り当てるO'Reillyの例(1997)に気づいた。プログラムテキスト。確かに動作しますが、この構文は男 / 情報 awk見逃しただけでしょうか、廃止されたのでしょうか...? マニュアルで見た構文はオプションだけです-v

awk '/home/{print foo, bar}' foo="cat" bar="dog" /proc/$$/cmdline

出力:cat dog

答え1

実際にはPOSIXですawk-v(POSIX 2008へのリンク、以前のバージョンにも含まれていたと思います)。オプションセクションのもう1つの方法はオペランドセクション。

-v最後にファイル名を付けて割り当てを渡す場合と渡す場合では違いがあります。

  • -v

アプリケーションは、代入引数が代入オペランドと同じ形式であることを確認する必要があります。指定された変数の代入は、awkプログラムを実行する前に、BEGINパターンに関連付けられたアクションを含む(ある場合)。このオプションは複数回指定できます。

  • ファイル名に混在:

[...] このような変数の割り当てはそれぞれ次のファイルの処理の直前したがって、最初のファイル引数の前の割り当ては、BEGIN アクション (ある場合) の後に実行され、最後のファイル引数の後の割り当ては、END アクション (ある場合) の前に発生します。ファイル引数がない場合、割り当ては標準入力を処理する前に実行されます。

例:

$ cat input 
hello
hello
$ awk -v var=one 'BEGIN{print var} /hello/{print var} END{print var}' \
    var=two input var=three input var=four
one
two
two
three
three
four

答え2

これは、 で外部的に変数を設定する古いスタイルですawk。あいまいでした ( というファイル名があったらどうなるでしょうかfoo=cat) ので、後のバージョンでは-vオプションが追加されました。下位互換性のためにおそらく機能するはずですが、保証はできません。また、前述したように、 オプション-vは新しいため、 のすべてのバージョンでawkサポートされているわけではありません。

関連情報