≡菜单

9个强大的Awk内置数字功能

如同 awk内置变量,awk还具有许多用于数字,字符串,输入和输出操作的内置函数。 Awk具有以下三种类型的高级内置函数类别。

  1. 内置数字运算功能
  2. 字符串操作的内置函数
  3. 输入输出操作的内置功能


对于刚接触awk的用户,请参考我们正在进行的 awk示例 系列,我们讨论了— awk简介 , awk变量 awk运算符 .

在本文中,让我们回顾一下awk Numeric内置函数。

1. Awk int(n)函数

int()函数为您提供了给定参数的整数部分。这将产生给定n的最低整数部分。 n是具有或不具有浮点数的任何数字。如果将整数作为参数,此函数将返回相同的值。对于浮点数,它将截断。

$ awk 'BEGIN{
print int(3.534);
print int(4);
print int(-5.223);
print int(-5);
}'
3
4
-5
-5

2. Awk log(n)函数

log()函数提供给定参数n的自然对数。仅当n为正数时,log()返回对数值。如果您提供任何无效数字(甚至为负),则会引发错误。

$ awk 'BEGIN{
print log(12);
print log(0);
print log(1);
print log(-1);
}'
2.48491
-inf
0
nan

在上面的输出中,您可以确定log(0)是无穷大,显示为-inf,而log(-1)给您错误nan(不是数字)

3. Awk sqrt(n)函数

sqrt函数给出给定整数n的正平方根。此函数也接受正数,如果将负数作为参数,它将返回nan错误。

$ awk 'BEGIN{
print sqrt(16);
print sqrt(0);
print sqrt(-12);
}'
4
0
nan

4. Awk exp(n)函数

exp函数为e提供n的幂。

$ awk 'BEGIN{
print exp(123434346);
print exp(0);
print exp(-12);
}'
inf
1
6.14421e-06

在上面的输出中,对于exp(1234346),它会为您提供输出无穷大,因为这超出了范围。

5. Awk sin(n)函数

sin()函数给出正弦值n,其中n为弧度。

$ awk 'BEGIN {
print sin(90);
print sin(45);
}'
0.893997
0.850904

6. Awk cos(n)函数

cos()返回n的余弦值,其中n为弧度。

$ awk 'BEGIN {
print cos(90);
print cos(45);
}'
-0.448074
0.525322

7. Awk atan2(m,n)函数

此功能为您提供以弧度为单位的m / n的反正切值。

$ awk 'BEGIN {
print atan2(30,45);

}'
0.588003

8. Awk rand()函数

rand()用于生成0到1之间的随机数。它从不返回0到1。它始终返回0到1之间的值。数字在一次awk运行中是随机的,但每次运行都可以预测。 Awk使用某种算法来生成随机数。由于此算法是固定的,因此数字是可重复的。

下面的示例生成1000个介于0到100之间的随机数,并显示每个数字的使用频率

$cat rand.awk
BEGIN {
while(i<1000)
{
	n = int(rand()*100);
	rnd[n]++;
	i++;
}
for(i=0;i<=100;i++) {
	print i,"Occured", rnd[i], "times";
}
}
$

将上面脚本的一些输出粘贴到此处。

$awk -f rand.awk
0 Occured 6 times
1 Occured 16 times
2 Occured 12 times
3 Occured 6 times
4 Occured 13 times
5 Occured 13 times
6 Occured 8 times
7 Occured 7 times
8 Occured 16 times
9 Occured 9 times
10 Occured 6 times
11 Occured 9 times
12 Occured 17 times
13 Occured 12 times

从上面的输出中,确保rand()函数可以非常频繁地生成可重复的数字。

9.awk srand(n)函数

srand()用于初始化带有给定参数n的随机数生成。这样,只要程序开始执行,它就会从n开始生成数字。如果未提供任何参数,它将使用一天中的时间生成种子。

例。生成5个从5到50的随机数

$cat srand.awk
BEGIN {
#initialize the seed with 5.
srand(5);
# Totally I want to generate 5 numbers.
total=5;
#maximum number is 50.
max=50;
count=0;
while(count < total) {
	rnd = int(rand() * max);
	if ( array[rnd] == 0 ) {
		count++;
		array[rnd]++;
	}
}
for ( i=5; i<=max; i++) {
	if ( array[i] )
		print i;
}
}

在此srand.awk中,使用rand()函数,生成数字并与最大值相乘以生成最大值为50的数字,并检查生成的随机数是否已存在于数组中(如果不存在),递增其索引和递增循环计数。这样它就会生成5个这样的数字,并最终在for循环中从最小数到最大,并仅打印具有该值的索引。

这是上面脚本的输出

$ awk -f  srand.awk
9
15
26
37
39

如果您喜欢这篇文章,您可能还会喜欢..

  1. 50个Linux Sysadmin教程
  2. 50个最常用的Linux命令(包括示例)
  3. 排名前25位的最佳Linux性能监视和调试工具
  4. 妈妈,我找到了! – 15个实用的Linux Find命令示例
  5. Linux 101 Hacks第二版电子书 Linux 101黑客手册

Bash 101 Hacks书 Sed和Awk 101黑客手册 Nagios Core 3书  Vim 101黑客手册

{ 4 评论 … 加一 }

  • 匿名 2011年2月9日,上午5:31

    >对于浮点数,它将产生最接近的整数。
    不正确它会截断。

  • 拉梅什·纳塔拉简 2011年2月11日,下午5:28

    谢谢汤姆。现在已更正。

  • 匿名 2012年2月4日,上午2:21

    对此并不十分了解,但是示例9中的for循环没有条件语句,该条件语句将导致它从5打印到50。

    对于(i = 5; i<=50;i++)
    If(array [i] == 1)<==难道不是我们想要的原因,因为我们基本上在检查索引值是true还是false,因为在上一部分中,您将其设置为array [rnd] ++,它将在任何索引中将数组值加1?然后我们将打印正确。只是问,因为最后一条语句让我在那儿循环了。

  • 匿名 2014年9月27日,下午6:46

    再次更正注释,因为未显示大于和小于的符号:
    如果我没看错,我们在这里使用关联数组映射。
    均值(a [index]:[value])
    这里的index可以是整数,也可以是字符串。
    so i think condition [ If(array [i] == 1)] can not be used.

发表评论