awk printf with variable

时间:2013-07-15 05:56:15

标签: bash awk

以下表达式按预期工作:

$ 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

2 个答案:

答案 0 :(得分:1)

请注意foo=4/3foo设置为字符串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