十一、条件语句
格式:
{if(表达式) {语句1;语句2;...}}
{if(表达式){语句1; 语句2...} else {语句1; 语句2;...}}
{if(表达式1){语句1; 语句2...} else if (表达式2){语句1; 语句2;..} else if (表达式2){语句1; 语句2;..} else if (表达式2){语句1; 语句2;..} ... else{语句1; 语句2... }}
注意:if语句是操作必须用花括号括起来。
十二、循环
1.while循环
{while(表达式) {语句1;语句2;...}}
{do{语句1;语句2;...}while(表达式)}
例:
awk '{i = 1; while(i <= NF) {print NF, $i; i++}}' test_awk.txt
注意:i的起始值应从1开始,因为i=0时,$i = $0代表一整行。
2.for循环
例:
awk '{for(i = 1; i < NF; i++) {print $i}}' test_awk.txt
3.循环控制
continue跳出内循环,break跳出外循环
十三、程序控制语句
1.next语句
next语句从输入文件中取出下一行输入,然后从awk的顶部继续执行。
例:
awk '{if($1 ~ /ABC/){next} else{print}}' test_awk.txt #abc def hic lmn abc #123 456 1.23 4.5 321 #You are a good boy #That's a very lovely dog
说明:如果某一行的第一个字段匹配ABC,awk就跳过该行,从输入文件中读取下一行。然后从头开始执行。
2.exit语句
exit语句用于终止awk程序。他只能中断对记录的处理,不能跳过END语句
十四、数组
1.关联数组的下标
数组在awk中被称为关联数组,因为它的的下标既可以是数字也可以是字符串。
和变量一样,数组也是被用到时才创建,而且,awk还能判定这个数组用于保存数字还是字符串。根据使用时的上下文环境,数组元素别初始化为数字0或空字符串。数组的大小不需要声明。
cat test_awk.txt
abc def hic lmn abc
123 456 1.23 4.5 321
ABC Def hIc lmN ABC
ABC Def cih lmN dsf
You are a good boy
That's a very lovely dog
例:
awk '{arr[x++] = $2};END {for(i = 0; i < NR; i++) print arr[i];}' test_awk.txt #def #456 #Def #Def #are #a
说明:数组arr下标是用户自定义的变量x,运算符++表明这是一个数值型的变量。awk将x初始化为0,并且每次使用x后将其加1,每条记录的第2个字段都将赋值给arr中的相应元素。END块儿中使用for循环来处理数组。
特殊for循环
当数组的下表为字符串或非连续的数字时,不能用常规的for循环来遍历数组,这时候就要用特殊的for循环。特殊for循环把下标作为键来查找与之关联的值。
格式:
{
for(key in arrayname) {
print arrayname[key];
}
}
例:
awk '/^ABC/{arr[NR] = $1}END{for(i = 1; i <= NR; i++) {print arr[i]}}' test_awk.txt # # #ABC #ABC # # awk '/^ABC/{arr[NR] = $1}END{for(key in arr) {print arr[key]}}' test_awk.txt #ABC #ABC
说明:
1、如果输入行的行首匹配模式ABC,就为数组arr赋一个值,NR作为arr的索引。在每一行匹配到ABC时,arr就赋一个第一个字段的值,当到达END块时,arr数组就包括arr[3],arr[4],因此用for循环打印数组时,索引为1,2,5,6的行为空。
2、用特殊for循环打印数组时,只打印相应下标的元素值,打印结果的次序是随机的,因为关联数组是以散列方式存储的。
2.用字符串作为数组下标
数组下标可以由包含单个字符,或字符串的变量组成,如果是字符串,则必须用双引号引起来。
例:
awk '/ABC/{arr["ABC"]++;}/abc/{arr["abc"]++}END{print arr["ABC"],arr["abc"]}' test_awk.txt #2 1
说明:数组arr包含两个元素,arr["ABC"]和arr["abc"],这两个元素的初值都是0,每次匹配到ABC,arr["ABC"]的值就加一,每次匹配到abc时,arr["abc"]的值就加一,注意:每行只会计算一次,哪怕ABC在一行上出现多次。
使用字段的值作为数组下标
任何表达式都可以作为数组的下标,所以也可以用字段作为数组的下标。
例:
cat name_awk.txt
Tom
Sam
Tom
David
Sam
Mary
awk '{count[$1]++}END{for(name in count) {print name,count[name]}}' name_awk.txt #David 1 #Tom 2 #Mary 1 #Sam 2
说明:这里第一个字段作为数组的下标,数组的下标随着第一个字段的变化而变化,首先count的第一个下标是Tom,而count["Tom"]保存的值就是1,然后count["sam"]的值被设为1,当在第一个字段再次出现Tom时,count["Tom"]的值被加1,此时count["Tom"]的值变为了2,依次类推。
数组与splite函数
awk的内置函数能将字符串拆分成词,然后保存在数组中。您指定字段的分隔符,也可以就用FS的当前值。
格式:
split(字符串, 数组, 分隔符)
split(字符串, 数组)
例:
awk 'BEGIN{split("2012-01-30", date, "-"); print "Year:"date[1],"Month:"date[2],"Day:"date[3];}' #Year:2012 Month:01 Day:30
说明:字符串2010-01-30以“-”作为分隔符,分隔的词保存在数组dete中,现在date[1]是2012,date[2]是01,date[3]是30
注意:此时的数组的下标是从1开始的。
delete函数
delete函数用于删除数组元素
例:
awk '{count[$1]++}END{for(name in count) {delete count[name];print name,count[name]}}' name_awk.txt #David #Tom #Mary #Sam
说明:这个例子中,只打印出了name的值,因为count中的元素已被删除,所以count[name]没有了值。