如何强制 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”