awk 中的外部变量

wen*_*nzi 4 awk

可能的重复:
在 awk 中使用脚本参数

我有一个脚本,其中有一个脚本片段

x=3
awk '$2=$x{print $1}' infile
Run Code Online (Sandbox Code Playgroud)

外部变量是 x,

但它在awk中提示错误

那么在这种情况下,如何让awk成功运行呢?

谢谢!

Sté*_*las 7

一个shell变量就是这样:一个外壳变量。如果你想把它变成一个awk变量,你需要这样的语法:

awk -v x="$x" '$2 == x {print $1}' infile
Run Code Online (Sandbox Code Playgroud)

或者

awk '$2 == x {print $1}' x="$x" infile
Run Code Online (Sandbox Code Playgroud)

但是,那些遇到了一个问题:转义序列在其中展开(在 GNU awk4.2 或更高版本中,如果$x以 开头@/和结尾/,则将其视为正则表达式类型的变量)。

因此,例如,如果 shell 变量包含反斜杠n两个字符,则 awk 变量最终将包含换行符(对于 gawk 4.2+,如果它包含@/foo/,则 awk 变量将包含foo并且类型为regexp)。

另一种方法(但需要 POSIX awk 或 nawk(与仍然在一些奇怪的 Unices 上发现的原始 awk 相反))是使用环境变量:

x="$x" awk '$2 == ENVIRON["x"] {print $1}' infile
Run Code Online (Sandbox Code Playgroud)

另一种方法(仍然使用较新的 awk)是在 awk 中使用 ARGV 数组:

awk 'BEGIN {x = ARGV[1]; delete ARGV[1]}
  $2 == x {print $1}' "$x" infile
Run Code Online (Sandbox Code Playgroud)