AWK运算符 - Awk教程

像其他编程语言,AWK也提供了大量的运算符。本教程介绍AWK运算符的例子:

算术运算符

AWK支持以下算术运算符:

加法

它是由正(+)符号,其将两个或多个数字来表示。下面的例子说明了这一点:

[jerry]$ awk 'BEGIN { a = 50; b = 20; print "(a + b) = ", (a + b) }'

在执行上面的代码后,得到以下结果:

(a + b) =  70

减法

减法表示( - )符号中减去两个或两个以上的数字。下面的例子说明了这一点:

[jerry]$ awk 'BEGIN { a = 50; b = 20; print "(a - b) = ", (a - b) }'

在执行上面的代码后,得到以下结果:

(a - b) =  30

乘法

它是由星号(*)符号相乘的两个或多个数来表示。下面的例子说明了这一点:

[jerry]$ awk 'BEGIN { a = 50; b = 20; print "(a * b) = ", (a * b) }'

在执行上面的代码后,得到以下结果:

(a * b) =  1000

除法

它是由斜线(/)符号,其将两个或两个以上的数来表示。下面的例子说明了这一点:

[jerry]$ awk 'BEGIN { a = 50; b = 20; print "(a / b) = ", (a / b) }'

在执行上面的代码后,得到以下结果:

(a / b) =  2.5

它由百分号(%)符号其中查找模除两个或两个以上的数表示。下面的例子说明了这一点:

[jerry]$ awk 'BEGIN { a = 50; b = 20; print "(a % b) = ", (a % b) }'

在执行上面的代码后,得到以下结果:

(a % b) =  10

递增和递减运算符

AWK支持下增量和减量运算符:

前递增

它是由++表示。它由1递增操作数的值这个操作符先递增操作数的值,然后返回增加后的值。例如在下面的例子中此操作者设定两个操作数的值,a和b加到11。

awk 'BEGIN { a = 10; b = ++a; printf "a = %d, b = %d\n", a, b }'

在执行上面的代码后,得到以下结果:

a = 11, b = 11

前减量

它由下式 -- 表示 。操作数减去1,操作符首先递减操作数的值,然后返回递减值。例如在下面的例子中此操作者设定两个操作数中的值,a和b至9。

[jerry]$ awk 'BEGIN { a = 10; b = --a; printf "a = %d, b = %d\n", a, b }'

在执行上面的代码后,得到以下结果:

a = 9, b = 9

后递增

它是由++表示。它递增操作数1的值,这个操作符首先将返回操作数的值,并增加它的值。例如示例显示操作数a值为11以及b的值为10。

[jerry]$ awk 'BEGIN { a = 10; b = a++; printf "a = %d, b = %d\n", a, b }'

在执行上面的代码后,得到以下结果:

a = 11, b = 10

后递减

它可表示为-- 。操作数减少1,操作符首先将返回操作数的值,再递减它的值。例如示例显示的操作数a值为9和b的值为10。

[jerry]$ awk 'BEGIN { a = 10; b = a--; printf "a = %d, b = %d\n", a, b }'

在执行上面的代码后,得到以下结果:

a = 9, b = 10

赋值运算符

AWK支持以下赋值运算符:

简单的赋值

它是由=表示。下面的例子说明了这一点:

[jerry]$ awk 'BEGIN { name = "Jerry"; print "My name is", name }'

在执行上面的代码后,得到以下结果:

My name is Jerry

简写加法

它是由 += 表示。下面的例子说明了这一点:

[jerry]$ awk 'BEGIN { cnt=10; cnt += 10; print "Counter =", cnt }'

在执行上面的代码后,得到以下结果:

Counter = 20

在上面的例子中第一个语句将值 10 赋值经变量cnt,下一条语句缩写操作递增它的值为10。

简写减法

它可表示为 -=。下面的例子说明了这一点:

[jerry]$ awk 'BEGIN { cnt=100; cnt -= 10; print "Counter =", cnt }'

在执行上面的代码后,得到以下结果:

Counter = 90

在上面的例子中第一个语句将值100赋值经变量cnt,在下一语句缩写操作符递减10。

简写乘法

它是由* =表示。下面的例子说明了这一点:

[jerry]$ awk 'BEGIN { cnt=10; cnt *= 10; print "Counter =", cnt }'

在执行上面的代码后,得到以下结果:

Counter = 100

在上面的例子中第一个语句将值10赋值给变量cnt,接下来一条语句缩写操作乘以10。

简写除法

它是由/=表示。下面的例子说明了这一点:

[jerry]$ awk 'BEGIN { cnt=100; cnt /= 5; print "Counter =", cnt }'

在执行上面的代码后,得到以下结果:

Counter = 20

在上面的例子中第一个语句将值100赋值到变量cnt,以及在下一语句缩写运算除法5。

简写模运算

它是由%=表示。下面的例子说明了这一点:

[jerry]$ awk 'BEGIN { cnt=100; cnt %= 8; print "Counter =", cnt }'

在执行上面的代码后,得到以下结果:

Counter = 4

简写指数级运算

它是由^=表示。下面的例子说明了这一点:

[jerry]$ awk 'BEGIN { cnt=2; cnt ^= 4; print "Counter =", cnt }'

在执行上面的代码后,得到以下结果:

Counter = 16

上面的例子提高cnt的指数4的值。

简写指数级

它是由** =表示。下面的例子说明了这一点:

[jerry]$ awk 'BEGIN { cnt=2; cnt **= 4; print "Counter =", cnt }'

在执行上面的代码后,得到以下结果:

Counter = 16

这个例子也由4提高cnt 的值。

关系运算符

AWK支持以下关系运算符:

等于

它是由==表示。如果两个操作数相等则返回true,否则返回false。下面的例子说明了这一点:

awk 'BEGIN { a = 10; b = 10; if (a == b) print "a == b" }'

在执行上面的代码后,得到以下结果:

a == b

不等于

它可表示为!=。如果两个操作数是不平等则返回true,否则返回false。

[jerry]$ awk 'BEGIN { a = 10; b = 20; if (a != b) print "a != b" }'

在执行上面的代码后,得到以下结果:

a != b

小于

它是由<表示。如果左侧操作数小于右边的操作数则返回true,否则返回false。

[jerry]$ awk 'BEGIN { a = 10; b = 20; if (a < b) print "a < b" }'

在执行上面的代码后,得到以下结果:

a < b

小于或等于

它是由<=表示。如果左侧操作数小于或等于右边的操作数则返回true,否则返回 false。

[jerry]$ awk 'BEGIN { a = 10; b = 10; if (a <= b) print "a <= b" }'

在执行上面的代码后,得到以下结果:

a <= b

大于

它是由>表示。如果左侧操作数大于右边的操作数则返回true, 否则返回false。

[jerry]$ awk 'BEGIN { a = 10; b = 20; if (b > a ) print "b > a" }'

在执行上面的代码后,得到以下结果:

b > a

大于或等于

它是由>=表示。如果左侧操作数大于或等于右边的操作数则返回true,否则返回false。

[jerry]$ awk 'BEGIN { a = 10; b = 10; if (a >= b) print "a >= b" }'

在执行上面的代码后,得到以下结果:

b >= a

逻辑运算符

AWK支持以下逻辑运算符:

逻辑与

它是由&&表示。下面是逻辑与操作的语法。

expr1 && expr2

它的计算结果为true ,如果这两个expr1 和 expr2计算为true,否则结果为假。当且仅当expr1 计算为true时expr2才进行计算。例如下面示例检查给定的单位数字是否为八进制格式。

[jerry]$ awk 'BEGIN {num = 5; if (num >= 0 && num <= 7) printf "%d is in octal format\n", num }'

在执行上面的代码后,得到以下结果:

5 is in octal format

逻辑或

它是由||表示。下面是逻辑或运算符的语法。

expr1 || expr2

它的计算结果为true,如果任一expr1或expr2为true,否则结果为false。当且仅当expr1的计算结果为false,expr2才进行计算。下面简单的例子说明了这一点。

[jerry]$ awk 'BEGIN {ch = "\n"; if (ch == " " || ch == "\t" || ch == "\n") print "Current character is whitespace." }'

在执行上面的代码后,得到以下结果:

Current character is whitespace.

逻辑非

它是由感叹号表示(!)。下面是相同的语法。

! expr1

它返回expr1的逻辑补。如果expr1的计算结果为true,则返回0;否则返回1。例如下面的示例检查字符串是否为空。

[jerry]$ awk 'BEGIN { name = ""; if (! length(name)) print "name is empty string." }'

在执行上面的代码后,得到以下结果:

name is empty string.

三元运算符

我们可以使用三元操作轻松实现条件表达式。下面是相同的语法:

condition expression ? statement1 : statement2

当条件表达式返回true,statement1被执行,否则statement2被执行。比如下面的例子显示查找最大数。

[jerry]$ awk 'BEGIN { a = 10; b = 20; (a > b) ? max = a : max = b; print "Max =", max}'

在执行上面的代码后,得到以下结果:

Max = 20

一元运算符

AWK支持以下一元运算符:

一元加法运算

它是由+表示。它通过+1乘以单操作数。

[jerry]$ awk 'BEGIN { a = -10; a = +a; print "a =", a }'

在执行上面的代码后,得到以下结果:

a = -10

负号

它可表示为 - 。它通过-1乘以单个操作数。

[jerry]$ awk 'BEGIN { a = -10; a = -a; print "a =", a }'

在执行上面的代码后,得到以下结果:

a = 10

指数型运算符

本教程介绍了两种形式的指数的操作符提供的例子:

指数型

它是一个指数运算符,它提高操作数的值。比如下面的例子提高10的2次幂的值。

[jerry]$ awk 'BEGIN { a = 10; a = a ^ 2; print "a =", a }'

在执行上面的代码后,得到以下结果:

a = 100

指数型

它是一个指数运算符,它提高操作数的值。比如下面的例子提高10的2次幂的值。

[jerry]$ awk 'BEGIN { a = 10; a = a ** 2; print "a =", a }'

在执行上面的代码后,得到以下结果:

a = 100

字符串连接运算符

空格是字符串连接运算符,它合并两个字符串。下面简单的例子说明了这一点:

[jerry]$ awk 'BEGIN { str1="Hello, "; str2="World"; str3 = str1 str2; print str3 }'

在执行上面的代码后,得到以下结果:

Hello, World

数组成员运算符

它是通过in表示。在访问数组元素时使用。下面简单的例子打印使用该操作的数组元素。

[jerry]$ awk 'BEGIN { arr[0] = 1; arr[1] = 2; arr[2] = 3; for (i in arr) printf "arr[%d] = %d\n", i, arr[i] }'

在执行上面的代码后,得到以下结果:

arr[0] = 1
arr[1] = 2
arr[2] = 3

正则表达式运算符

本教程介绍了两种形式的正则表达式运算符的例子:

匹配

它被表示为〜。它会查找包含匹配字符串的字段。比如下面的例子打印行,其中包含的模式9。

[jerry]$ awk '$0 ~ 9' marks.txt

在执行上面的代码后,得到以下结果:

2)    Rahul    Maths    90
5)    Hari    History    89

不匹配

它表示为 !~。它看起来不包含匹配字符串的字段。例如下面的例子将打印不含有模式9的行。

[jerry]$ awk '$0 !~ 9' marks.txt

在执行上面的代码后,得到以下结果:

1)    Amit    Physics    80
3)    Shyam    Biology    87
4)    Kedar    English    85