awk连载9: awk数组的使用
数据在awk里是很重要的一块,很多的操作比如文件的合并,及做一些统计操作的时候都需要利用到数组。
正常情况下定义变量的时候,都是一个变量一个值,即 变量=值 这种格式,如果想要一个变量有多个值则需要数组来定义,比如定义数组aa有3个值xx,yy,zz。
这里该如何引用数组aa里的xx这个值?如何引用数组aa里yy这个值呢?我们先看如何来定义数组
假设有一个储物柜里存放的每个人的手机(每个手机称为”元素”),每个手机上都贴了一个标签(如上图用颜色标记的部分),记录的是张三的手机、王五的手机等。如果想找王五的手机,则通过 储物柜a[王五]这种方式获取,可以得到王五的手机是 手机z,即储物柜a[王五]的值为手机z。这里储物柜a是一个数组,王五是下标。
再看下图
这里定义了一个数组aa,数组里有4个元素,每个元素上都有一个标签,这个标签叫下标,引用某个元素的时候,通过 数组名[下标名] 来引用,比如aa[x]的值为333。
如果我们要定义数组的话就是通过 数组名[下标名]=值 的方式来定义,其实定义数组的过程就是定义下标的过程,下标可以是数字也可以是字母,如果下标是字母的话必须要用””引起来(值如果是字母的话也需要使用双引号引起来)。
这里定义了数组aa,里面有3个元素,分别是
aa["x"]=1
aa["y"]="abc"
aa[1]=222
然后打印元素aa[“y”]的值,得到abc。
当然在定义元素的时候,可以放在一行来写,但是每个元素之间要用分号;隔开:
[root@vms63 ~]# echo "" | awk '{aa["x"]=1;aa["y"]="abc"; aa[1]=222;print aa["y"]}'
abc
[root@vms63 ~]#
如何判断某下标是否出现在数组里,可以使用if判断,语法如下
if(“下标” in 数组名){ print 操作}
如果此下标出现在此数组里,则执行打印操作,否则不执行打印操作。
这里判断x是否在数组aa里,如果在则打印OK,因为数组里存在下标x,所以正常打印。
因为下标里不存在z,所以结果是不打印的。
第二种定义数组的方式
创建d1.txt,内容如下:
[root@vms63 ~]# cat d1.txt
021 北京
010 上海
0516 徐州
[root@vms63 ~]#
通过如下方式来定义数组aa:
[root@vms63 ~]# awk '{aa[$1]=$0}' d1.txt
因为awk会循环文件的每一行,读取第一行的时候,把$1的值即021作为下标,$0即这整行内容作为值,得到一个元素aa[“021”]=”021 北京”。依次循环下来就得到3个元素分别是:
aa[“021”]=”021 北京”
aa[“010”]=”010 上海”
aa[“0516”]=”0516 徐州”
下面我们打印某个元素看看:
练习文件的合并
创建d2.txt内容如下:
[root@vms63 ~]# cat d2.txt
021 xxx
010 yyy
0516 zzz
[root@vms63 ~]#
[root@vms63 ~]# cat d1.txt
021 上海
010 北京
0516 徐州
[root@vms63 ~]#
现在想把两个文件合并成
021 上海 xxx
010 北京 yyy
0516 徐州 zzz
这种格式,该如何操作?
[root@vms63 ~]# awk 'NR==FNR{aa[$1]=$0}NR!=FNR{print aa[$1],$2}' d1.txt d2.txt
021 上海 xxx
010 北京 yyy
0516 徐州 zzz
[root@vms63 ~]#
解释:
NR==FNR{aa[$1]=$0}
当NR==FNR时,说明现在处理的是d1.txt文件,此时定义一些列的数组元素,得到
aa[“021”]=”021 北京”
aa[“010”]=”010 上海”
aa[“0516”]=”0516 徐州”
NR!=FNR{print aa[$1],$2}
当NR!=FNR时,说明现在处理的是d2.txt。因为两个文件第一列内容是一样的,即$1的值是一样的,所以当在处理d2.txt的第一行(内容是021 xxx)时, $1的值为021,打印数组aa[“021”]得到021 上海, 然后再打印$2,得到xxx。print aa[$1],$2最终的结果是得到021 上海 xx。
遍历数组
[root@vms63 ~]# echo "" | awk '{
aa["x"]=1
aa["y"]="abc"
aa[1]=222
}'
[root@vms63 ~]#
这里定义了数组aa,里面有3个元素,要是想遍历数组里所有的元素,可以考虑for循环:
这里用i来循环aa里所有的下标,然后分别打印aa[i],这样就可以遍历所有元素。
当然我们也可以删除某个元素,用delete语句:
这里把元素aa[“x”]删除了,再次遍历所有元素的时候就看不到aa[“x”]的值了。
评论列表(1条)
炒鸡喜欢段老师的文章,简洁干练,简单易懂,段老师YYDS