-7

以下表达式按预期工作:

$ 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
4

2 回答 2

3

请注意,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
$
于 2013-07-15T06:11:31.763 回答
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() 函数因此,如果您想通过像您的示例一样在字符串中传递整个表达式来评估 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
于 2013-07-15T06:05:17.917 回答