awk -i inplace不作为脚本的一部分工作



我有一个像这样的文件:

AABBCC 10
DDEEFF 20
etc

我需要找到一行包含我们说AABBCC并替换它后面的数字。我用awk:

awk -i inplace '{if($1=="AABBCC") {$2="30"} print $0}' myfile.txt

它工作得很好

但是当我在脚本中这样做时

awk -i inplace '{if($1==$A) {$2=$B} print $0}' myfile.txt

它不工作。

我试过在$A和$B周围加逗号,但没有成功。任何想法吗?我的bash是GNU bash,版本5.0.17(1)

下面的脚本可以工作,并提供所需的输出:

awk -i inplace '{if($1==A) {$2=B} print $0}' A="$A" B="$B" myfile.txt

更多关于shell变量如何在awk中工作的信息:https://linuxhint.com/awk_command_variables/

希望这对你有帮助。谢谢。

在你的第二个版本中,例如

awk -i inplace '{if($1==$A) {$2=$B} print $0}' myfile.txt

$A$Bawk变量,不是shell变量。注意awk脚本是如何在单引号之间运行的——shell变量不会展开。因此,awk看到了没有值的$A,并简单地将变量初始化为0

awk中,您可以使用-v选项传递变量值,也可以使用BEGIN{ ... }规则来传递变量值。因为你想在每个注释中使用shell变量,你需要使用-v格式,例如

awk -v A="AABBCC" -v B=30 -i inplace '{if($1==$A) {$2=$B} print $0}' myfile.txt

(注意:使用$AAABBCC将没有意义,因为它不对应于输入中的有效字段,但使用A可以。现在对于B=30,它可能对应于30字段,但如果您的字段少于30,那么它将是B而不是$Bawk中的$前缀表示变量的值对应于特定的输入字段—您想要它的值)

现在awk知道A是什么,B是什么。