重複の可能性:
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 awk
4.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