选择

Awk的模式适合用于为进一步的处理从输入中选择相关的数据行。由于不带动作的模式会打印所有匹配模式的行,所以很多awk程序仅包含一个模式。

通过对比选择

只有模式没有动作,输出所有与模式匹配的行:

# 输出第二个字段大于等于5的所有行
$2 >= 5

通过计算选择

# 输出第二个字段和第三个字段的乘积大于50的所有行
$2 * $3 > 50

通过文本内容选择

除了数值测试,还可以选择包含特定单词或短语的输入行:

# 输出第一个字段是`Exited`单词的所有行
$1 == "Exited"

# 输出任意字段中包含Exited单词的行
/Exited/

# 匹配Exited或者TIME
/Exited||TIME/

# 不匹配
!/Exited/

操作符 == 用于测试相等性,也可以使用正则表达式的模式来查找包含任意字母组合,单词或短语的文本。

模式组合

可以使用括号和逻辑操作符(与 && , 或 || , 以及非 ! )对模式进行组合。

# 两个条件都满足的行仅打印一次
$2 >= 4 || $3 >= 20

# 如果某个输入行两个条件都满足,这个程序会打印它两遍
$2 >= 4
$3 >= 20

输出第二个地酸大于等于4或者第三个字段大于等于20的所有行。

数据验证

实际的数据中总是会存在错误的。在检查数据的值是否合理以及格式是否正确方面,Awk是个优秀的工具。

数据验证本质上是否定的:不是打印具备期望属性的行,而是打印可疑的行。

如下程序使用对比模式 将5个数据合理性测试应用于 emp.data 的每一行:

NF != 3     { print $0, "number of fields is not equal to 3" }
$2 < 3.35   { print $0, "rate is below minimum wage" }
$2 > 10     { print $0, "rate exceeds $10 per hour" }
$3 < 0      { print $0, "negative hours worked" }
$3 > 60     { print $0, "too many hours worked" }

如果没有错误,则没有输出。

BEGIN与END

特殊模式:

  • BEGIN 用于匹配第一个输入文件的第一行之前的位置,

  • END 则用于匹配处理过的最后一个文件的最后一行之后的位置。

这个程序使用 BEGIN 来输出一个标题::

BEGIN { print "Name    RATE    HOURS"; print ""}

# 将会输出 Name    RATE    HOURS 和一个空行

程序的动作部分你可以在一行上放多个语句,不过要使用分号进行分隔。

注意:普通的 print 是打印当前输入行,与之不同的是 print "" 会打印一个空行。

最后更新于

这有帮助吗?