在AWK中,可以定义多个模式和对应的动作块来进行复杂的文本处理。一个基本的AWK脚本结构如下:
pattern1 { action1 }
pattern2 { action2 }
...
这里,每个pattern
是一个条件表达式,当当前行满足该条件时,相应的action
块中的命令就会被执行。如果省略了模式部分,那么动作块将对每一行生效。
例如:
/regex_pattern1/ { print "匹配 pattern1: ", $0 }
/regex_pattern2/ { action2; next } # 如果匹配 pattern2,则执行 action2,并跳过后续动作
!/regex_pattern3/ { action3 } # 如果不匹配 pattern3,则执行 action3
# BEGIN 和 END 块也是特殊的模式:
BEGIN { FS=":" } # 在处理任何输入之前设置分隔符为冒号
END { print "总计行数:", NR } # 在所有输入行处理完毕后打印总行数
# 或者针对不同列值进行操作
$3 > 50 { print "第3列大于50: ", $0 }
# 多个动作也可以放在同一个模式下用分号隔开
/pattern4/ {
action4;
action5;
}
更复杂的用法可能还包括变量赋值、数组操作、函数调用等。以下是一个包含多个模式和动作块的例子:
NR == 1 { header = $0; next } # 第一行是表头,存储并跳过
$3 >= 10 && $3 <= 20 { sum += $2 } # 第三列在10到20之间的行,累加第二列数值
/.*/ { print } # 打印所有行(默认动作)
END { print "统计范围内的总和:", sum } # 在处理完所有行后输出累加的结果
在这个例子中,我们首先处理文件的第一行作为表头并保存它,然后计算第三列值在特定范围内时对应的第二列数值之和,最后在处理结束时输出这个总和。同时,所有行都会被打印出来。