如何强制 AWK 将字符串评估为数学表达式?
How to coerce AWK to evaluate string as math expression?
有没有办法在 awk 中将字符串作为数学表达式求值?
balter@spectre3:~$ echo "sin(0.3) 0.3" | awk '{print ,sin()}'
sin(0.3) 0.29552
我想知道一种将第一个输入也计算为 0.29552 的方法。
awk 缺少 eval(...)
函数。这意味着在 awk 程序初始化后,您不能根据输入将字符串转换为代码。好的,也许可以做到,但如果不在 awk 中编写您自己的解析和评估引擎就不行。
我建议使用 bc
来完成这项工作,例如
[edwbuck@phoenix ~]$ echo "s(0.3)" | bc -l
.29552020666133957510
请注意,这需要将 sin
缩短为 s
,因为这是 bc
正弦运算。
您可以创建自己的 eval 函数,它会再次调用 awk 来执行您想要的任何命令:
$ cat tst.awk
{ print eval(), sin() }
function eval(str, cmd,line,ret) {
cmd = "awk 7BEGIN{print " str "; exit}7"
if ( (cmd | getline line) > 0 ) {
ret = line
}
close(cmd)
return ret
}
$ echo 'sin(0.3) 0.3' | awk -f tst.awk
0.29552 0.29552
$ echo '4*7 0.3' | awk -f tst.awk
28 0.29552
$ echo 'tolower("FOO") 0.3' | awk -f tst.awk
foo 0.29552
使用 gawk 4.1.2 版:
echo "sin(0.3) 0.3" | awk '{split(,a,/[()]/);f=a[1];print @f(a[2]),sin()}'
tolower(FOO)
也可以。
您可以试试 Perl,因为它有 eval() 函数。
$ echo "sin(0.3)" | perl -ne ' print eval '
0.29552020666134
$
对于给定的输入,
$ echo "sin(0.3) 0.3" | perl -ne ' /(\S+)\s+(\S+)/ and print eval(), " ", '
0.29552020666134 0.3
$
这是一个简单的衬垫!
math(){ awk "BEGIN{printf }"; }
使用示例:
math 1+1
产生“2”
math 'sqrt(25)'
产量“5”
x=100; y=5; math "sqrt($x) + $y"
产量“15”
有没有办法在 awk 中将字符串作为数学表达式求值?
balter@spectre3:~$ echo "sin(0.3) 0.3" | awk '{print ,sin()}'
sin(0.3) 0.29552
我想知道一种将第一个输入也计算为 0.29552 的方法。
awk 缺少 eval(...)
函数。这意味着在 awk 程序初始化后,您不能根据输入将字符串转换为代码。好的,也许可以做到,但如果不在 awk 中编写您自己的解析和评估引擎就不行。
我建议使用 bc
来完成这项工作,例如
[edwbuck@phoenix ~]$ echo "s(0.3)" | bc -l
.29552020666133957510
请注意,这需要将 sin
缩短为 s
,因为这是 bc
正弦运算。
您可以创建自己的 eval 函数,它会再次调用 awk 来执行您想要的任何命令:
$ cat tst.awk
{ print eval(), sin() }
function eval(str, cmd,line,ret) {
cmd = "awk 7BEGIN{print " str "; exit}7"
if ( (cmd | getline line) > 0 ) {
ret = line
}
close(cmd)
return ret
}
$ echo 'sin(0.3) 0.3' | awk -f tst.awk
0.29552 0.29552
$ echo '4*7 0.3' | awk -f tst.awk
28 0.29552
$ echo 'tolower("FOO") 0.3' | awk -f tst.awk
foo 0.29552
使用 gawk 4.1.2 版:
echo "sin(0.3) 0.3" | awk '{split(,a,/[()]/);f=a[1];print @f(a[2]),sin()}'
tolower(FOO)
也可以。
您可以试试 Perl,因为它有 eval() 函数。
$ echo "sin(0.3)" | perl -ne ' print eval '
0.29552020666134
$
对于给定的输入,
$ echo "sin(0.3) 0.3" | perl -ne ' /(\S+)\s+(\S+)/ and print eval(), " ", '
0.29552020666134 0.3
$
这是一个简单的衬垫!
math(){ awk "BEGIN{printf }"; }
使用示例:
math 1+1
产生“2”
math 'sqrt(25)'
产量“5”
x=100; y=5; math "sqrt($x) + $y"
产量“15”