选择
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 "" 会打印一个空行。
最后更新于
这有帮助吗?