首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

利用 AWK 的数值计算功能提升工作效率(1)简介

利用 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.awk
1
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; 最后的 197 是输入, 分别对应于文件中的 $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
}

返回列表