Unix scripts: how to sum numbers up

If you're ever thought of summing up more than two numbers in shell script, perhaps this basic post will be a good start for your Unix scripting experiments.

Basic construction for summing up in shell scripts

In my Basic arithmetic operations in Unix shell post last year, I've shown you how to sum up two numbers:

SUM=$(($NUMBER1 + $NUMBER2)

using the same approach, it's possible to calculate sums of as many numbers as you like, if you use one of the loops available in your shell.

Before we get started, let's create a simple file with numbers we'll work with:

ubuntu$ for i in 1 2 3 4 5 6 7 8 9; do echo $i >> /tmp/nums; done;
ubuntu$ cat /tmp/nums
1
2
3
4
5
6
7
8
9

Using a while loop to sum numbers up in Unix

Here's an example of how you can use a while loop in Unix shell for summing numbers up. Save it as a /tmp/sum.sh script, and don't forget to do chmod a+x /tmp/sum.sh so that you can run it!

#!/bin/sh
#
SUM=0
#
while read NUM
do
        echo "SUM: $SUM";
        SUM=$(($SUM + $NUM));
        echo "+ $NUM: $SUM";
done < /tmp/nums

Here's how the output will look when you run it:

ubuntu$ /tmp/sum.sh
SUM: 0
+ 1: 1
SUM: 1
+ 2: 3
SUM: 3
+ 3: 6
SUM: 6
+ 4: 10
SUM: 10
+ 5: 15
SUM: 15
+ 6: 21
SUM: 21
+ 7: 28
SUM: 28
+ 8: 36
SUM: 36
+ 9: 45

Of course, your data will most probably will be in a less readable form, so you'll have to do a bit of parsing before you get to sum the numbers up, but the loop will be organized in the same way.

That's it for today, enjoy and feel free to ask questions!

See also:

Share and Enjoy

  • Facebook
  • Twitter
  • Delicious
  • LinkedIn
  • StumbleUpon
  • Add to favorites
  • Email
  • RSS
  • Ankan

    Hello,

    Can you please provide the following codes:

    1. I divide 20 /6 . The answer id now 3. It sould be 3.33
    2. How to do 10.222 + 1.1 = 11.322

    Thanks in advance. :-)

  • Pingback: Floating point calculations in Unix scripts — UNIX Tutorial: Learn UNIX

  • Pete

    Hello Ankan,
    you need to use "scale" option from bc:
    echo 'scale=25;57/43' | bc

    Scale controls the number of decimal points. Not sure if scale is an option, command or what not… but that's your answer.

    Regards,
    Pete

  • jeff

    You can make your code tighter in ksh and bash:

    SUM+=$NUM

    instead of

    SUM=$(($SUM + $NUM))

    Also, you can use an awk one-liner instead of a while loop:

    for i in 1 2 3 4 5; do echo $i; done | awk '{s+=$1} END {print s}'

    or

    cat | awk '{s+=$1} END {print s}'
    1
    2
    3
    4
    5
    ^d
    15 (result)

  • Neeraj Batra

    Hi Pete

    Thanks for your response, But the problem is that in below example

    echo 'scale=25;57/43′ | bc

    Values 57 and 43 are in variables in my script

    i.e.

    a=57
    b=43
    echo 'scale=25;$a/$b′ | bc

    Above does not work :(

    Plz help

    Rgds
    Neeraj Batra

  • jeff

    Neeraj Batra, you would need double quotes instead of single quotes to allow the shell to interpret the variables.

  • Emil

    Hello

    I'm trying to sum a field in a | delimited file but not receiving the correct value. Not sure how I'm getting e+06. Please help
    cat file.TXT |awk 'FS = "|" { sum += $12 } END { print sum }'|xargs -n1|while read sum ;do aa='$'$sum ;done
    echo $aa
    7.60411e+06

    Thank you

  • Niranjan Patil97

    i have 3 values in one varirable and 5 values in another variable and i need to find out differnce between these values one by one in shell script