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
francois@zaphod:~$ 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
francois@zaphod:~$ 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
francois@zaphod:~$
without BC command you cannot use decimal values :
francois@zaphod:~$ while read ; do echo $(( "REPLY" )) ; done < toto
-bash: 37 * 60 + 55.52: syntax error: invalid arithmetic operator (error token is ".52")
francois@zaphod:~$
If you have perl:
perl -ne 'print eval $_,"\n"' math.txt
(I get 50000 lines per second on my laptop using this).