我正在尝试执行类似的操作:
sd=0.206887
mean=0.0195143
awk '{print $2-$mean/$sd}' ABC.txt
但是我收到了错误:
awk: (FILENAME=ABC.txt FNR=1) fatal: division by zero attempted
想知道在这种情况下使用变量的正确方法,TIA
答案 0 :(得分:2)
尝试
awk "{print \$2-$mean/$sd}" ABC.txt
Shell双引号允许替换,$
在$2
中进行转义,以便将其传递给Awk而不是由shell解释。
直接插值是将变量传递给Awk的一种棘手的方法。一个不太棘手的方法是使用Awk' -v
选项将变量定义为Awk变量:
awk -v foo=123 -v bar=str 'BEGIN { print foo, bar }'
另一种最透明的方法是使用环境变量:
envvar=hey awk 'BEGIN { print ENVIRON["envvar"] }'
这更透明的原因是-v
的参数被Awk解释为Awk语法。更确切地说,作为字符串文字内部的语法:
$ echo 'foo\nbar'
foo\nbar
$ awk -v contains_newline='foo\nbar' 'BEGIN { print contains_newline }'
foo
bar
$ no_newline='foo\nbar' awk 'BEGIN { print ENVIRON["no_newline"] }'
foo\nbar
答案 1 :(得分:1)
使用-v
标志:
awk -v sd=0.206887 -v mean=0.0195143 '{print $2-mean/sd}' ABC.txt
类型安全:
awk -v sd=0.206887 -v mean=0.0195143 '{print ($2+0)-(mean+0)/(sd+0)}' ABC.txt
来自docs
-v var = val
- 指定var = val
在程序开始执行之前将变量var设置为值val。