awkの外部変数

awkの外部変数

重複の可能性:
awkでスクリプトパラメータを使用する

スクリプトスニペットを含むスクリプトがあります。

x=3
awk '$2=$x{print $1}' infile

外部変数はxであり、

しかし、awkではエラーが発生します。

それでは、この場合awkを正常に実行するにはどうすればよいですか?

ありがとうございます!

答え1

シェル変数は次のとおりです。シェル変える。それをアッ変数には次の構文が必要です。

awk -v x="$x" '$2 == x {print $1}' infile

または

awk '$2 == x {print $1}' x="$x" infile

しかし、問題が発生します。エスケープシーケンスが拡張されます(そしてGNU awk4.2以降では$xで始まり@/終わる場合は、/正規表現型の変数として扱われます。)。

たとえば、シェル変数に2つの文字が含まれている場合バックスラッシュそしてN、awk変数には最終的に次のものが含まれます。新しいチーム文字(gawk 4.2+の場合が含まれている場合、@/foo/awk変数はを含み、foo型になりますregexp)。

別の方法(しかしPOSIX awkまたはnawkが必要です(まだ奇妙なUnicesの元のawkとは反対))は、環境変数を使用することです。

x="$x" awk '$2 == ENVIRON["x"] {print $1}' infile

別の方法(まだ最新のawkを使用)は、awkでARGV配列を使用することです。

awk 'BEGIN {x = ARGV[1]; delete ARGV[1]}
  $2 == x {print $1}' "$x" infile

答え2

外部変数は直接使用できないため、awkまずawk変数にインポートする必要があります。

x=3
awk -v foo="$x" '$2=foo{print $1}' infile

関連情報