3

input file (FileInput.txt):

10 20 3 100 5 3 27

this is my awk script:

BEGIN{ while((getline line < "FileInput.txt") > 0) { }

how can i count sum? I tried sum+=line however it sums only the first column.

6

Something like can do the work:

awk 'BEGIN {sum=0} {for (i = 1; i <= NF; i++) sum+=$i} END {print sum}' FileInput.txt
  • 2
    Not strictly required to initialize the sum, but good for maintainability. – glenn jackman Jan 17 at 20:23
5

The issue with your code is twofold:

  1. It does not actually make use of awk in the way one usually does. It explicitly loops over the lines of the file in a BEGIN block. This is not the idiomatic way one usually writes awk programs, which is to supply (optional) patterns or conditions for blocks to be executed for each input record (line).
  2. Since the input consists of records (by default single lines) with more than one number, you would have to treat these records in such a way that the individual numbers are summed up. In other words, you can't add 20 3 to sum, but would have to split that up into 20 and 3 first.

With GNU awk or mawk, we may set the record separator, RS, to a regular expression that matches any sequence of whitespace characters instead of the default newline. This make awk read the file as a collection of whitespace-separated single field records. Summing these and printing the sum at the end is then trivial:

$ awk -v RS='[[:space:]]+' '{ sum += $1 } END { print sum }' FileInput.txt
168

Altenatively,

$ awk 'BEGIN { RS = "[[:space:]]+" } { sum += $1 } END { print sum }' FileInput.txt
168

Or, you can do some variant on what Romeo Ninov shows, which is to loop over the fields of each line,

$ awk '{ for (i = 1; i <= NF; ++i) sum += $i } END { print sum }' file
168
2

You could transform your file so you have one number per line:

tr -s '[:blank:]' '\n' < FileInput.txt

Then pick a solution from https://stackoverflow.com/q/2702564/7552 to sum them. For example

tr -s '[:blank:]' '\n' < FileInput.txt | perl -nle '$sum += $_ } END { print $sum'
  • Or something like |awk '{sum+=$1} END {print sum}' – Romeo Ninov Jan 17 at 20:31

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.