Arithmetic Operators
====================
The `awk' language uses the common arithmetic operators when
evaluating expressions. All of these arithmetic operators follow normal
precedence rules and work as you would expect them to.
The following example uses a file named `grades', which contains a
list of student names as well as three test scores per student (it's a
small class):
Pat 100 97 58
Sandy 84 72 93
Chris 72 92 89
This programs takes the file `grades' and prints the average of the
scores:
$ awk '{ sum = $2 + $3 + $4 ; avg = sum / 3
> print $1, avg }' grades
-| Pat 85
-| Sandy 83
-| Chris 84.3333
The following list provides the arithmetic operators in `awk', in
order from the highest precedence to the lowest:
`- X'
Negation.
`+ X'
Unary plus; the expression is converted to a number.
`X ^ Y'
`X ** Y'
Exponentiation; X raised to the Y power. `2 ^ 3' has the value
eight; the character sequence `**' is equivalent to `^'.
`X * Y'
Multiplication.
`X / Y'
Division; because all numbers in `awk' are floating-point
numbers, the result is _not_ rounded to an integer--`3 / 4' has
the value 0.75. (It is a common mistake, especially for C
programmers, to forget that _all_ numbers in `awk' are
floating-point, and that division of integer-looking constants
produces a real number, not an integer.)
`X % Y'
Remainder; further discussion is provided in the text, just after
this list.
`X + Y'
Addition.
`X - Y'
Subtraction.
Unary plus and minus have the same precedence, the multiplication
operators all have the same precedence, and addition and subtraction
have the same precedence.
When computing the remainder of `X % Y', the quotient is rounded
toward zero to an integer and multiplied by Y. This result is
subtracted from X; this operation is sometimes known as "trunc-mod."
The following relation always holds:
b * int(a / b) + (a % b) == a
One possibly undesirable effect of this definition of remainder is
that `X % Y' is negative if X is negative. Thus:
-17 % 8 = -1
In other `awk' implementations, the signedness of the remainder may
be machine dependent.
*Note:* The POSIX standard only specifies the use of `^' for
exponentiation. For maximum portability, do not use the `**' operator.