第5.5节:awk算术运算
1 第5.5节:awk算术运算
::: alert-danger
awk的算术运算与C语法的算术运算调试类似,如果用户学习过C/C++语言,此章节可以快速一扫而过。
:::
awk
语言在计算表达式时会使用常见的算术运算符。所有这些算术运算符都遵循常规的优先级规则,其工作方式与你预期的一致。
下面的示例使用了一个名为 grades.txt
的文件,该文件包含学生姓名列表以及每个学生的三门考试成绩(这是一个小班):
Pat 100 97 58
Sandy 84 72 93
Chris 72 92 89
以下程序读取 grades.txt
文件并输出成绩的平均值:
$ awk '{ sum = $2 + $3 + $4 ; avg = sum / 3
> print $1, avg }' grades.txt
-| Pat 85
-| Sandy 83
-| Chris 84.3333
以下列表按优先级从高到低的顺序列出了 awk 中的算术运算符:
表达式 | 含义解释 |
---|---|
x ^ y x ** y | 幂运算;x 的 y 次幂。例如,2 ^ 3 的值是 8;字符序列 ** 与 ^ 等价。(c.e. 可能是特定语境下的缩写,若无特殊说明可忽略 ) |
- x | 取反(否定)。 |
+ x | 一元正号;将表达式转换为数字(一般用于显式强调数值类型转换, 实际运算里单独用效果常类似直接取值,但有语法语义上的转换作用 )。 |
x * y | 乘法运算。 |
x / y | 除法运算;由于 awk 中所有数字都是浮点数,结果不会取整为整数。 比如 3 / 4 的结果是 0.75 。(这是个常见误区,尤其是对于 C 语言程序员而言,容易忘记 awk 里所有数字都是浮点型,对看似整数的常量做除法会得到实数,而非整数 ) |
x % y | 取余运算;文本中紧跟在本列表之后会有更详细的讨论。 |
x + y | 加法运算。 |
x - y | 减法运算。 |
一元正号和负号优先级相同,乘法类运算符(乘法、除法、取余)优先级相同,加法和减法优先级相同。
计算 x % y
(取余运算)时,商向零取整为整数后再乘以 y
。用该结果去减 x
,此操作有时也称作 “截断取余(trunc - mod)” 。以下等式始终成立:
b * int(a / b) + (a % b) == a
这种取余定义可能带来一个不太理想的结果:若 x
为负数,x % y
结果也为负。例如:
-17 % 8 = -1
该定义符合 POSIX 标准,标准规定 %
运算符的结果,等价于使用标准 C 语言 fmod()
函数的结果,而该函数的工作方式就如前文所述。
在其他 awk
实现中,取余结果的符号可能因机器而异。
注意:POSIX 标准仅规定用 ^
进行幂运算。为了最大程度保证可移植性,请勿使用 **
运算符。
作者声明:本文用于记录和分享作者的学习心得,可能有部分文字或示例来自AI平台,如:豆包、DeepSeek(硅基流动)(注册链接)等,由于本人水平有限,难免存在表达错误,欢迎留言交流和指教!
Copyright © 2022~2025 All rights reserved.