![awk 中的外部变量](https://linux22.com/image/27217/awk%20%E4%B8%AD%E7%9A%84%E5%A4%96%E9%83%A8%E5%8F%98%E9%87%8F.png)
可能的重复:
在 awk 中使用脚本参数
我有一个脚本,其中脚本片段是
x=3
awk '$2=$x{print $1}' infile
外部变量是x,
但awk提示错误
那么在这种情况下,如何让awk成功运行呢?
谢谢!
答案1
shell 变量就是:A壳多变的。如果你想把它变成一个awk变量,您需要一个语法,例如:
awk -v x="$x" '$2 == x {print $1}' infile
或者
awk '$2 == x {print $1}' x="$x" infile
然而,它们遇到了一个问题:转义序列在其中扩展(并且在 GNU awk
4.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
另一种方法(仍然使用较新的 awks)是在 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