Arithmetic operations between files

arithmetictext processing

Say I have these two input files:

> file1
2
3
4

> file2
10
100
1000

And I would like to compute: file1/file2 for each line, resulting in file3:

> file 3
0.2
0.03
0.004

Divisions in bash can be achieved by: $((file1_line/file2_line))

Best Answer

A paste and bc combination is a good choice for simple arithmetic:

paste -d/ file1 file2 | bc -l

Output:

.2000000000
.0300000000
.0040000000

A more advanced example

With some trickery you can get a bit more complicated. Say file3 contains:

6
7
8

You can do (file1 + file3) / file2 like this:

paste -d'(+)/' /dev/null file1 file3 /dev/null file2

Output:

(2+6)/10
(3+7)/100
(4+8)/1000

This works because paste cycles through its delimiter list for each line.

React to divide-by-zero

Illigal operations sent to bc result in a warning being sent to standard error. You could redirect these to a different file and decide program flow based on its content, e.g.:

paste -d/ file1 file2 | bc -l > resultfile 2> errorfile
if grep -q 'Divide by zero' errorfile; then
  echo "Error in calculation"
else
  echo "All is well"
fi

Or if there was any error:

paste -d/ file1 file2 | bc -l > resultfile 2> errorfile
if ! file errorfile | grep -q empty; then
  echo "Error in calculation"
else
  echo "All is well"
fi
Related Question