以下表达式按预期工作:
$ awk 'BEGIN {print 4/3}'
1.33333
但是,如果我使用变量代替文字值,则不会打印 正如所料:
$ awk -v foo=4/3 'BEGIN {print foo}'
4/3
如何使用带有awk
printf
表达式的变量?
这是一种解决方法:
$ printf 'BEGIN {print %s}' 4/3 | awk -f-
1.33333
答案 0 :(得分:1)
请注意foo=4/3
将foo
设置为字符串4/3
。当通过%f
打印时,'4/3'被视为4
;如果使用%s
打印,则打印为4/3
。如果要评估表达式,则需要在脚本内部进行评估。
例如:
awk 'END {printf "%f\n", foonum/fooden }' foonum=4 fooden=3 /dev/null
请注意bash
不执行浮点运算。因此,这会产生1作为输出:
awk 'END {printf "%s\n", foo }' foo=$((4/3)) /dev/null
也许你想使用bc
:
$ bc -l <<< "4/3"
1.33333333333333333333
$
答案 1 :(得分:0)
您有以下作品的语法问题:
awk 'END {foo=4/3; printf "%f", foo}' /dev/null
或者将值从shell传递给awk:
foo=$(bc -l <<< 4/3) && awk -v foo=$foo 'END {printf "%f\n", foo}' /dev/null
请注意 awk没有任何eval()函数因此,如果你想通过像你的例子一样在String中传递整个表达式来评估awk中的数学表达式,那么使用如下代码:
awk 'END {"bc -l <<< " foo|getline foo; printf("%f\n", foo)}' foo='4/3' /dev/null
不使用bc进行编辑:
awk 'END {split(foo, a, "/"); printf("%f\n", a[1]/a[2])}' foo='4/3' /dev/null