利用 AWK 的数值计算功能提升工作效率(1)简介
- UID
- 1066743
|
利用 AWK 的数值计算功能提升工作效率(1)简介
Awk 是一种优秀的文本样式扫描和处理工具。 Awk 与 sed 和 grep 有些相似, 但功能比后者强不少。 awk 提供的功能包括样式载入, 流控制,数学运算符,进程控制以及许多内置的变量和函数等。 借助于这些功能, 我们可以很方便地利用 awk 对各种文件 (如试验产生的数据文件,数据库文件等) 进行处理。 本文介绍了 awk 在数值计算方面的运用, 并通过几个实际的例子, 阐述了如何利用 awk 的计算功能来提高我们的工作效率。
Awk 基本的运算符,数学函数以及简单的运算实例Awk 支持不少常见的运算符, 如 + (加),- (减), * (乘), / (除), ^ 或 ** (乘方), % (取模) 等等。 此外, awk 也提供了一些常用的数学函数, 比如 sin(x), cos(x), exp(x), log(x), sqrt(x), rand()。 使用这些运算符和函数可以直接进行一些简单的运算:
清单 1. 用 awk 做简单的数值计算1
2
3
4
5
6
7
| echo | awk '{print 19+7}' ==> 26
echo | awk '{print 19-7}' ==> 12
echo | awk '{print 19*7}' ==> 133
echo | awk '{print 19/7}' ==> 2.71429
echo | awk '{print 19**7}' ==> 893871739
echo | awk '{print 19%7}' ==> 5
echo | awk '{print atan2(19, 7)}' ==> 1.21781
|
上面的计算也可以用一个脚本文件 calc.awk 来完成:
清单 2. 脚本文件 calc.awk1
2
3
4
5
6
7
8
9
| {
print $1 " + " $2 " = " $1 + $2
print $1 " - " $2 " = " $1 - $2
print $1 " x " $2 " = " $1 * $2
print $1 " / " $2 " = " $1 / $2
print $1 " ^ " $2 " = " $1 ** $2
print $1 " mod " $2 " = " $1 % $2
print " atan2( " $1 " , " $2 " ) " " = " atan2($1, $2)
}
|
执行 awk -f calc.awk 19 7 可以得到和清单 1 中一样的计算结果。 这里选项 -f 允许 awk 调用并执行程序文件 calc.awk; 最后的 19 和 7 是输入, 分别对应于文件中的 $1 和 $2。
复杂一些的数值计算现在我们利用 awk 来完成一些稍微复杂的计算。 我们首先用 awk 来计算 Fibonacci 数列,相应的 awk 程序 Fib.awk 见清单3:
清单 3. 计算 Fibonacci 数列的程序文件1
2
3
4
5
6
7
8
9
| function fibo(n) {
if(n<=1) return 1;
return (fibo(n-2) + fibo(n-1));
}
BEGIN {
n = (ARGV[1] < 1) ? 1 : ARGV[1];
printf("%d\n", fibo(n));
exit;
}
|
计算时使用命令 awk -f Fib.awk n。 这里的输入 n 是整数。 另外只要把上面程序中的函数fibo(n) 稍微改一下, 就可以用来进行阶乘的运算, 修改后的代码如下:
清单 4. 计算价乘的 awk 脚本1
2
3
4
5
6
7
8
9
| function factorial(n) {
if(n<=1) return 1;
return (n*factorial(n-1));
}
BEGIN {
n = (ARGV[1] < 1) ? 1 : ARGV[1];
printf("%d\n", factorial(n));
exit;
}
|
我们再来看一个求平方根的例子。 尽管 awk 提供了计算平方根的函数, 但我们也可以通过自己写程序来实现, 相应的算法如清单 5 所示; 清单 6 则给出了一个具体的例子: 求数字 3.7 的平方根:
清单 5. 求平方根的算法
清单 6. 计算平方根的例子1
2
3
4
5
6
7
8
9
10
| BEGIN {
a = 3.7;
x = a;
while((x**2-a)**2 > 1e-12) {
x = (x + a/x)/2;
}
print x
}
|
|
|
|
|
|
|