Patterns

Patterns

Patterns 控制是否执行 actions,只有当 pattern 匹配的时候,才会执行 action

本文介绍六种常用的 pattern

  • BEGIN { statements }:所有行处理之前执行一次 BEGIN
  • END { statements }:所有行处理完了执行一次 END
  • expression { statements }:普通的表达式
  • /正则表达式/ { statements }:匹配正则
  • 组合表达式 { statements }:使用 &&||! 进行组合
  • pattern1, pattern2 { statements }:范围匹配

BEGIN 和 END

BEGIN 和 END 只会执行一次,BEGIN 是在开始执行前执行,END 是在结束前执行。

一种常见的使用 BEGIN 的用法是改变默认的列分割符,列分割符默认被一个内置变量 FS 所控制,这个变量的默认值是空格或者tabs。如下示例在 BEGIN 中设置了 FS\t,同时打印了表头。在 END 块中打印了面积和人口的总和。

BEGIN {
        FS = "\t"
        printf("%10s %6s %5s   %s\n\n", "COUNTRY", "AREA", "POP", "CONTINENT") 
      }
      {
        printf("%10s %6d %5d   %s\n", $1, $2, $3, $4)
        area = area + $2
        pop = pop + $3
      }
END {
        printf("\n%10s %6d %5d\n", "TOTAL", area, pop)
    }

expression

表达式示例:

$3 / $2 >= 0.5
$0 >= "M"
$1 < $4

可用的比较符号:

~!~ 是专门用于比较字符串的符号

如果表达式返回的是一个布尔值,那么根据此布尔值来决定是否匹配这一行;如果表达式返回的是一个数字,那么数字如果是非 0 数字,会匹配这一行;如果表达式返回的是一个字符串,那么非空字符串,会匹配这一行。

当比较操作符的两个比较对象,均为数字,那么使用数字的比较原则进行大小比较;否则任何数字将会被转为字符串,使用字符串的方式按照 ASCII 顺序进行比较。