Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

passing bash expression to AWK for floating point arithmetic

I was trying to do floating point arithmetic in bash, but as floats are not supported, was trying to get the solution using AWK. Below is the issue i am facing:

I see this working fine for me:

code

echo - | awk '{printf("%04.4f \n", (-225.2*7+30*6)/17 + (19^2)/9) }'

output

-42.0301

But my motive is to "read an expression" and compute value correct to 4 decimals, so tried below code inputting same expression (-225.2*7+30*6)/17 + (19^2)/9) and its giving incorrect values(i guess variable is passed as string to awk):

code

read inpt 
echo - | awk -v input=$inpt '{printf("%04.4f \n", input) }'

output

0.0000

Note: Please ignore the space around second + in this example expression, that i can remove using sed or similar methods(with space i get syntactical error in awk while passing variable from bash).

Any help is highly appreciated. Thanks in advance

PS: the bash version in my case is "bash-4.2". I guess its the version of bash preventing me using from many other options.

like image 986
PRD Avatar asked Sep 19 '25 00:09

PRD


1 Answers

You can't evaluate data in a variable in awk out of the box. In this case you need to write an arithmetic evaluator or use a pre-existing one, like https://github.com/radare/radare2-bindings/blob/master/awk/calc.awk . Once you fix that missing parenthesis and quote your expression properly, you can:

$ echo "((-225.2*7+30*6)/17 + (19^2)/9)" | awk -f calc.awk
((-225.2*7+30*6)/17 + (19^2)/9) =        -42.0301
like image 70
James Brown Avatar answered Sep 21 '25 18:09

James Brown