I have a file with a table of numbers; the first line is a header line. I want to sum each column and print out sum and column name for each column using awk.

How can I do it?

  • This question needs example input and output. It's unclear otherwise.
    – Sparhawk
    May 27 '19 at 22:32

Assuming that every line has the same number of fields (columns):

awk '
    NR==1   { for (i=1; i<=NF; i++) header[i]=$i; next; }
            { for (i=1; i<=NF; i++) total[i] += $i; }
    END     { for (i=1; i<=NF; i++) print header[i] "=" total[i]+0 }

Sample input:

red green blue
1 2 4
8 16 32
64 128 256

Corresponding output:

  • One small improvement: on line 1 set n=NF then, everywhere, loop until i<=n -- that will cover the case where there are too many headers, and the output will include extra_header=0 May 21 '19 at 22:48
  • I was considering various approaches to handling badly formed input; capturing the number of headers was one of them.  But I’m not 100% sure that I understand your comment.   ISTM that setting n=NF when NR==1 is mostly good for guarding against the last line of input having too few fields.  And, if I take your suggestion, and the input has 42 headers, then my script will iterate over 42 fields even on lines that don’t have that many.  I believe that capturing the maximum NF would be more robust. May 22 '19 at 0:48
  • IMO you want a count for each header, so NF on line 1 will drive the counting. I don't know what we would want to output for lines with too many fields. May 22 '19 at 1:24

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.