# How to sum numbers inside many 2D arrays

I need to sum numbers located in a file like this one:

``````      column1  column2 column3
row1  a(1,1)   a(1,2)  a(1,3)
row2  a(2,1)   a(2,2)  a(2,3)
row3  a(3,1)   a(3,2)  a(3,3)
row4  a(4,1)   a(4,2)  a(4,3)

column4  column5 column6
row1  b(1,1)   b(1,2)  b(1,3)
row2  b(2,1)   b(2,2)  b(2,3)
row3  b(3,1)   b(3,2)  b(3,3)
row4  b(4,1)   b(4,2)  b(4,3)

column7  column8 column9
row1  c(1,1)   c(1,2)  c(1,3)
row2  c(2,1)   c(2,2)  c(2,3)
row3  c(3,1)   c(3,2)  c(3,3)
row4  c(4,1)   c(4,2)  c(4,3)
``````

and to output a thing like that:

``````   column1    a(1,1)+a(2,1)       a(3,1)+a(4,1)
column2    a(1,2)+a(2,2)       a(3,2)+a(4,2)
column3    a(1,3)+a(2,3)       a(3,3)+a(4,3)
column4    b(1,1)+b(2,1)       b(3,1)+b(4,1)
column5    b(1,2)+b(2,2)       b(3,2)+b(4,2)
column6    b(1,3)+b(2,3)       b(3,3)+b(4,3)
column7    c(1,1)+c(2,1)       c(3,1)+c(4,1)
column8    c(1,2)+c(2,2)       c(3,2)+c(4,2)
column9    c(1,3)+c(2,3)       c(3,3)+c(4,3)
``````

I have one way to do that in bash, but it only functions with two 2D-arrays and fails with this example, which contains three 2D arrays. I want something that could be useful to many 2D arrays. Here the script that only functions for two 2D arrays.

``````   sed 's/row[1-6]//;/^\$/d' test |
pr -2t |
awk 'NR==1{\$1=\$1; print; next}
!(NR%2){split(\$0,a); next}
{for(i=1;i<=NF;i++) \$i+=a[i]}1' |
tr ' ' '\n' |
pr -3t
``````

Note: to compute the sums replace cell indices with values with this:

``````       \$ tr -d 'ab(,)' < file > filenums
``````

I suppose the trick is to use `-3t` for the first `pr`, and then also add `-w200` (or so) to avoid that the last column gets clipped.
More generally, if you have N matrices, you'd use `pr -\${N}t -w \$((N*W))` as first `pr` command, where `W` is the character width of the one matrix (say, roughly 10 for each column plus a bit).