我有一个像这样的文件:
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
和$B
是awk
变量,不是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
(注意:使用$A
和AABBCC
将没有意义,因为它不对应于输入中的有效字段,但使用A
可以。现在对于B=30
,它可能对应于30字段,但如果您的字段少于30,那么它将是B
而不是$B
—awk
中的$
前缀表示变量的值对应于特定的输入字段—您想要它的值)
现在awk
知道A
是什么,B
是什么。