以下表达式按预期工作:
$ 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
请注意,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
$
您有语法问题,以下工作:
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