awk的流程控制BEGIN和END

#cat password
mysql

root:x:0:0:root:/root:/bin/bashsql

bin:x:1:1:bin:/bin:/sbin/nologinshell

operator:x:11:0:operator:/root:/sbin/nologinbash

haldaemon:x:68:68:HAL daemon:/:/sbin/nologinide

root:x:0:0:root:/root:/bin/bash测试

mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bashspa

root:x:0:0:root:/root:/bin/baship

#awk '/root/{count++;}{print "root was found "count" times"}' /mnt/passwd

root was found 1 timesit

root was found 1 timespip

root was found 2 times

root was found 2 times

root was found 3 times

root was found 3 times

root was found 4 times

# awk '/root/{count++;}END{print "root was found "count" times"}' /mnt/passwd

root was found 4 times

===========================

BEGIN模块后紧跟着动做块,这个动做块在awk处理任何输入文件以前执行。因此它能够在没有任何输入的状况下进行测试。它一般用来改变内建变量的值,如OFS,RS和FS等,以及打印标题。如:$ awk‘BEGIN{FS=”:”; OFS=”\t”; ORS=”\n\n”}{print $1,$2,$3} test。上式表示,在处理输入文件之前,域分隔符(FS)被设为冒号,输出文件分隔符(OFS)被设置为制表符,输出记录分隔符(ORS)被设置为两个换行符。$ awk ‘BEGIN{print “TITLE TEST”}只打印标题.

END不匹配任何的输入文件,可是执行动做块中的全部动做,它在整个输入文件处理完成后被执行。如$ awk ‘END{print “The number of records is” NR}’ test,上式将打印全部被处理的记录数。

如何把一行竖排的数据转换成横排?

awk ‘{printf(“%s,”,$1)}’ filename


awk ‘BEGIN {FS=”:”;OFS=”:”} gsub(/root/,”hwl”,$1) {print $0}’ passwd 做用于域t
awk ‘BEGIN {FS=”:”;OFS=”:”} gsub(/root/,”hwl”) {print $0}’ passwd 做用于所有域
awk ‘BEGIN {FS=”:”;OFS=”:”} sub(/root/,”hwl”,$6) {print $0}’ passwd 将t中第一次出现的r替换为s

=================================

在Unix awk中两个特别的表达式,BEGIN和END,这二者均可用于pattern中(参考前面的awk语法),提供BEGIN和END的做用是给程序赋予初始状态和在程序结束以后执行一些扫尾的工做。

任何在BEGIN以后列出的操做(在{}内)将在Unix awk开始扫描输入以前执行,而END以后列出的操做将在扫描彻底部的输入以后执行。所以,一般使用BEGIN来显示变量和预置(初始化)变量,使用END来输出最终结果。

例:累计销售文件xs中的销售金额(假设销售金额在记录的第三字段):

cat sx

一:50件:200.00

二:60件:300.00

三:70件:400.00

$awk
'BEGIN { FS=":";print "统计销售金额";total=0}
{print $3;total=total+$3;}
END {printf "销售金额总计:%.2f",total}' sx

统计销售金额

200.00

300.00

400.00

销售金额总计:900.00

(注:>是shell提供的第二提示符,如要在shell程序Unix awk语句和Unix awk语言中换行,则需在行尾加反斜杠)

在这里,BEGIN预置了内部变量FS(字段分隔符)和自定义变量total,同时在扫描以前显示出输出行头。而END则在扫描完成后打印出总合计。

# awk 'BEGIN { FS=":";print "统计销售金额";total=0} {print $3;total=total+$3;}{printf "销售金额总计:%.2f",total}' sx

统计销售金额

200.00

销售金额总计:200.00300.00 //200+0 300

销售金额总计:500.00400.00 //200+300 400

销售金额总计:900.00 //500+400

================================

包含BEGIN模式和END模式的脚本awkscript:

#!/usr/bin/awk -f
-f参数告诉awk将该文件做为awk的程序文件,而后便可运行该程序。
# awk script using pipes -- awkscript
#1-  第一部分BEGIN会先执行,在输入文件以前执行
BEGIN{
printf " %-22s%s ", "NAME", "DISTRICT"
print "--------------------------------------"
}
#-1
#2- 第二部分 awk脚本正文,要对来自输入文件datafile的每一行都要执行一遍
/west/{count++}
{printf "%s %s %-15s ", $3, $4, $1| "sort +1" }
#-2
#3- 第三部分 输入文件关闭后awk退出以前执行
END{
close "sort +1"
printf "The number of sales persons in the western "
printf "region is " count "." 
}

=================

awk  'BEGIN { OFS="%"}{print $1,$2}' file 经过设置输出分隔符(OFS="%")修改输出格式。
相关文章
相关标签/搜索