1

I need to sum the matrix elements of specific rows for each column. An example of the matrix is given below(input). So the matrix has 4 columns and 6 rows of numbers. I need to sum the numbers of specific rows for each column. I other words I need to sum the elements of row1 + row2 + row5 and row3 + row4 + row6 for each column.

Input :

   column1  column2 column3 column4    
     11.1     12       13     4          
     21.3     22       23     3                  
     31       32       33    45            
     41       42       43   536              
     23       32        6     5                   
      4        5        3     2                   

The output should looks like this.

  column1 column2 column3 column4    
    55.4    66      42      12
    76      79      79     583

I was trying to use awk like this:

awk 'NR==1{$1=$1; print; next} !(NR%2){split($0,a); next} {for(i=1;i<=NF;i++) $i+=a[i]}1' file

but I cannot get the expected result.

  • Do you really need to do it in bash specifically, as per your title? Doing math in sed, as you have tagged, is tricky. Is awk acceptable? – Jeff Schaller Jun 2 '16 at 12:56
  • @alloppp, please show your work so far and we can help correct any mistakes. – glenn jackman Jun 2 '16 at 12:58
  • must use awk or another tool to sum up floats as bash doesn't handle floats – mazs Jun 2 '16 at 13:02
  • @glennjackman I only can make the sum of the consecutive rows , see it : awk 'NR==1{$1=$1; print; next} !(NR%2){split($0,a); next} {for(i=1;i<=NF;i++) $i+=a[i]}1' file – alloppp Jun 2 '16 at 13:03
  • 1
    alloppp use the edit link to update your post – Jeff Schaller Jun 2 '16 at 13:04
3

KISS implementation in awk:

awk '
    FNR == 1 {
        n=NF;print;next
    } 
    FNR == 2 || FNR == 3 || FNR == 6 {
        for (i=1;i<=NF;i++) a[i]+=$i;
    } 
    FNR == 4 || FNR == 5 || FNR == 7 {
        for (i=1;i<=NF;i++) b[i]+=$i
    } END {
        for (i=1;i<=n;i++) printf("%8s", a[i]); print ""; 
        for (i=1;i<=n;i++) printf("%8s", b[i]); print "";
    }
' file
  • Might as well use i<=n in the loops setting "a" and "b" arrays. – glenn jackman Jun 2 '16 at 13:46
  • +1. FNR ~ /^(2|3|6)$/ { ... } etc also works and is less tedious than typing lots of || FNR == comparisons. – cas Jun 3 '16 at 0:12

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.