如何强制AWK将字符串评估为数学表达式?

时间:2019-01-12 04:22:47

标签: math awk evaluate

有没有一种方法可以将字符串作为awk中的数学表达式求值?

balter@spectre3:~$ echo "sin(0.3) 0.3" | awk '{print $1,sin($2)}'
sin(0.3) 0.29552

我想知道一种方法,也可以将第一个输入评估为0.29552。

5 个答案:

答案 0 :(得分:3)

awk缺少eval(...)函数。这意味着awk程序初始化后,您将无法基于输入进行字符串到代码的转换。好的,也许可以做到,但必须在awk中编写自己的解析和评估引擎。

我建议为此使用bc,例如

[edwbuck@phoenix ~]$ echo "s(0.3)" | bc -l
.29552020666133957510

请注意,这需要将sin缩短为s,因为这是bc的正弦运算。

答案 1 :(得分:2)

您可以只创建自己的eval函数,该函数再次调用awk来执行您想要执行的任何命令:

gcc -g -Wall -pedantic ...

答案 2 :(得分:1)

使用gawk版本4.1.2时:

echo "sin(0.3) 0.3" | awk '{split($1,a,/[()]/);f=a[1];print @f(a[2]),sin($2)}'

tolower(FOO)也可以。

答案 3 :(得分:1)

这是一个简单的班轮!

math(){ awk "BEGIN{printf $1}"; }

使用示例:

math 1+1  

收益“ 2”

math 'sqrt(25)'

产量为“ 5”

x=100; y=5; math "sqrt($x) + $y"

产量“ 15”

答案 4 :(得分:0)

您可以尝试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($1), " ", $2 '
0.29552020666134 0.3
$