# How can I evaluate a math equation, one per line in a file?

This awk seems to do the trick:

while IFS= read i; do
awk "BEGIN { print ($i) }" done < math.txt  From here Note that we're using ($i) instead of $i to avoid problems with arithmetic expressions like 1 > 2 (print 1 > 2 would print 1 into a file called 2, while print (1 > 2) prints 0, the result of that arithmetic expression). Note that since the expansion of the $i shell variable ends up being interpreted as code by awk, that's essentially a code injection vulnerability. If you can't guarantee the file only contains valid arithmetic expressions, you'd want to put some input validation in place. For instance, if the file had a system("rm -rf ~") line, that could have dramatic consequences.

here is what I whould do not sure it is the best method

bc < toto


depending what you want to do with datas

[email protected]:~$cat > toto 37 * 60 + 55.52 34 * 60 + 51.75 36 * 60 + 2.88 36 * 60 + 14.94 36 * 60 + 18.82 36 * 60 + 8.37 37 * 60 + 48.71 36 * 60 + 34.17 37 * 60 + 42.52 37 * 60 + 51.55 35 * 60 + 34.76 34 * 60 + 18.90 33 * 60 + 49.63 34 * 60 + 37.73 36 * 60 + 4.49 [email protected]:~$ while read ; do echo " $REPLY" | bc ; done < toto 2275.52 2091.75 2162.88 2174.94 2178.82 2168.37 2268.71 2194.17 2262.52 2271.55 2134.76 2058.90 2029.63 2077.73 2164.49 [email protected]:~$


without BC command you cannot use decimal values :

[email protected]:~$while read ; do echo$(( "REPLY" )) ; done < toto
-bash: 37 * 60 + 55.52: syntax error: invalid arithmetic operator (error token is ".52")
[email protected]:~$ If you have perl: perl -ne 'print eval$_,"\n"' math.txt


(I get 50000 lines per second on my laptop using this).