以if结构开头的语句属于操作语句。条件模式(conditional pattern)中,if是隐含的,而条件操作语句的if则是直接声明的。
if/else语句实现双路判断。
语句块必须括在花括号中,并且多条语句之间用分号或换行符分隔。
if/else和else if语句提供了多路判断功能。
循环的功能是:当测试表达式的条件为真时,重复执行表达式后面的语句。循环常常被用来对记录中的每个字段重复执行某种操作,或者在END块中用来循环处理某个数组中的所有元素。
使用while循环的第一步是给一个变量设初值,然后在while表达式中测试该变量。循环结束之前,一定要更新用来控制循环表达式的变量,否则循环将无休止地进行下去。
do/while循环与while循环很相似,唯一的区别在于do/while要先执行循环体一次,然后才测试表达式,while循环则是相反的。
for循环和while循环基本相同,只不过for循环的圆括号中需要3个表达式,前两个分别是初始化表达式(只能初始化一个变量)和测试表达式,第3个则用于更新测试表达式所用的变量。
for循环经常会在END操作中与数组一同处理,循环处理数组的所有元素。
循环控制语句
break语句用来在某个特定条件仍然为真时就跳出循环;
continue语句则是在特定条件为真时,让循环跳过continue之后的语句,将控制转回循环顶部,开始下一轮循环。
程序控制语句
next语句从输入文件中取出下一行输入,然后从awk脚本的顶部重新开始执行。
exit语句用于终止awk程序,不过它只能中断对记录的处理,不能跳过END语句。如果exit语句的参数是一个0 - 255之间的值(比如:exit 1),这个值就会被打印在命令行上,以表明程序是否执行成功,并且指出失败的类型。
数组
数组在awk中被称为关联数组(associative arrays),因为它的下标既可以是数字也可以是字符串,下标通常被称为键(key),并且与对应的数组元素的值相关联。
数组元素的键和值都存储在awk程序内部的一个表中,该表采用的是散列算法,数组元素不是顺序存储的。
变量和数组都是被用到时才被创建。
数组的大小不需要声明。
awk数组可用于从记录中收集信息,也可用于统计总数、计算词数、记录模式出现次数等应用。
下标只是一个键,所以不必从0开始。下标可以从任意值开始,数字或字符串都可以。
特殊for循环
当下标为字符串或非连续的数字时,不能用for循环来遍历数组,只能使用特殊for循环。
特殊for循环把下标作为键来查找与之关联的值。
用字符串作为数组下标:数组下标可以由包含单个字符或字符串的变量组成,如果是字符串,则必须用双引号引起来。
使用字段的值作为数组下标:任何表达式都可以用做数组的下标,所以也可以用字段做下标。
[root@centos ~]# awk '{dup[$2]++; if(dup[$2] > 1){name[$2]++}}\
>END{print "The duplicates were"\
>for (i in name) {print i,name[i]}}' datafile4
数组与split函数
awk的内置函数split能够将字符串拆分为词,然后保存在数组中。可以指定字段分隔符,也可以就用FS的当前值。
格式:
split(字符串,数组,字段分隔符)
split(字符串,数组)
delete函数用于删除数组元素
awk定义多维数组的方法是把多个下标串成字符串,下标之间用内置变量SUBSEP的值(\034)分隔。
nawk处理的命令行参数
nawk可以从内置数组ARGV中得到命令行参数,其中包括命令nawk。但所有传递给nawk的选项都不在其中。ARGV数组的下标从0开始。
ARGV是一个包含命令行参数个数的内置变量。
awk并不把命令行选项视为参数。
—————————————
变量SUBSEP的值是“\034” |
记录的字段数 NF |
记录的记录号 NR |
—————————————
阅读(1321) | 评论(1) | 转发(0) |