我一直在使用awk,但通常只是为了方便地从正在处理的数据中提取特定字段。不管使用什么分隔符,awk都可以很容易地提取您所需要的东西。但除了这个明显的特性,语言还有很多其他特性。awk可以提供的服务之一是进行一系列数学计算的能力——比如余弦和平方根——比您想象的要容易。
首先,试试这个。你可以打印一个数字的整数部分(也就是说,不是整数),通过这样做:
$ awk 'BEGIN{> print int(12.789);>}’12
显然,如果您在命令行上这样做,您不会感到不安,但是在编写脚本时,同样的逻辑非常方便。
您可以轻松地打印一个数字的对数。
$ awk 'BEGIN{> print log(111) >}
那么输出一个数的平方根呢?
$ awk 'BEGIN{> print sqrt(25) >}
您还可以构建awk脚本来对一个满是数字的文件执行计算,就像对一个数字进行计算一样简单。
整数:
{打印int(1美元);}
该脚本将打印文件中每行开头的数字的整数部分。
根:
{打印sqrt(1美元);}
如果数字不是每一行的第一个数字,将$1改为$2或$3,等等。
在查看数字文件后运行我们的脚本:
$ $ awk -f getInt numbers 12 54 4 25 $ awk -f getSqRt numbers 3.51355 7.37028 2
并且,如果分隔符不是某种形式的空白,在BEGIN语句中指定字段分隔符,如下所示:
$ cat getqrt2 BEGIN {FS=":"} {print sqrt($2);} $
在下面的代码行中,我们在一个数字文件上运行上面所示的脚本,其中数字是第二个字段,字段之间用冒号分隔。
首先,数字
$ cat nums top:12.345 bottom:54.321 right:4 left:25
结果:
$ awk -f getqrt2 nums 3.51355 7.37028 2
- Int (x)——最接近x的整数
- √x,正的√x
- Exp (x) - x (e ^ x)的指数或一个错误,如果x是超出范围
- Log (x)——x的自然对数(只要x是正数)
- Sin (x)也就是Sin x
- Cos (x) cosx
- Atan2 (y, x) arctan (y / x
- Rand()——一个随机数——总是在0和1之间
- Srand (x)——设置随机数的起始点
最后,这里是“maybe”命令的一个实现,几年前,一些Unix人士还在嘲笑这个命令。maybe命令会从“yes”到“no”不等。这个实现是通过awk命令完成的。它会随机回答“是”或“不是”——有点像扔硬币。
#!/bin/bash ans= ' awk -vmin=0 -vmax=1 'BEGIN{srand();打印int (min + rand() *(极大极小+ 1))}“如果(ans eq 0美元);然后echo "no"否则echo "yes" fi
《sed & awk》这本书是我读过的第一本O'Reilly的书,这些工具在几十年前把我吸引到Unix世界中起了关键作用。但awk的功能比我记忆中的要完整。我太习惯于使用它从任意数据中选择列,有时忘记了它自己能做多少处理。