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

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

awk私はコマンドラインでawk変数を設定して割り当てるO'Reillyの例(1997)を見つけました。後ろにプログラムのテキスト。うまくいきますが、これの構文が見つかりません人/情報が変です。。私だけが逃したのだろうか?価値が落ちましたか…?マニュアルで見ることができる唯一の構文は-vオプションです。

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

出力:cat dog

答え1

実際にPOSIXにあります。awk(POSIX 2008へのリンクです。以前のバージョンにもその機能があったようです。)-vで説明されていますオプション部分的には別の方法がありますオペランド部分。

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

  • そして-v

アプリケーションは、割り振りパラメーターが割り振りオペランドと同じ形式であることを確認する必要があります。指定された変数の割り当てが発生する必要があります。BEGINモード関連タスクを含むawkプログラムを実行する前(もしそうなら)。このオプションは複数回発生するように指定できます。

  • ファイル名と混在:

[...]これらの変数の割り当てはすべて行わなければなりません。次のファイルを処理する前にもしそうなら。したがって、最初のファイル・パラメーターの前の割り振りは 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サポートされているわけではありません。

関連情報