• 每天进步一点点!

文章分类

推荐网站

常用手册

awk实用程序(五)【原创】

<<返回

2011-12-28 16:42:54

十一、条件语句

格式:

{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]没有了值。

 

文章评论

  • 暂无评论

发表评论

昵称:

内容:

发表评论