awk通过BEGIN
,END
实现在文本处理器前和处理后依然可以执行一些处理。
awk的命令框架如下
BEGIN{ commands }
/pattern/{ commands }
/pattern/{ commands }
...
END{ commands }
其中,/pattern/
为正则表达式或逻辑表达式。
BEGIN{}
字段实现在文本处理前准备好相关的内容;END{}
字段实现在文本处理后继续对处理结果进行分析,例如可以在/pattern/{}
字段中将对文本的处理保留至数组,最后在END{}
字段中对数组进行进一步的处理。
案例
对文本中的某一列求均值
n=3
awk -v i=$n '{sum=sum+$i;}END{print sum/NR;}' input.txt
输出特定行
awk 'NR==3{print $0}' input.txt
awk '(NR<3) || (NR>6){print $0}' input.txt
awk '(NR<10) && (NR>6){print $0}' input.txt
输出正则表达式匹配行
# 输出非#开头的行
awk '/^[^#]/ {print $0}' input.txt
# 输出以字母开头的行
awk '/^[a-zA-Z]/ {print $0}' input.txt
# 输出以!结尾的行
awk '/!$/ {print $0}' input.txt