使用变量在awk中划分

时间:2016-01-05 16:27:01

标签: variables awk division

我正在尝试执行类似的操作:

 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

2 个答案:

答案 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。