awk连载9: awk数组的使用

数据在awk里是很重要的一块,很多的操作比如文件的合并,及做一些统计操作的时候都需要利用到数组。

正常情况下定义变量的时候,都是一个变量一个值,即 变量=值 这种格式,如果想要一个变量有多个值则需要数组来定义,比如定义数组aa有3个值xx,yy,zz。

这里该如何引用数组aa里的xx这个值?如何引用数组aa里yy这个值呢?我们先看如何来定义数组

awk连载9: awk数组的使用 

假设有一个储物柜里存放的每个人的手机(每个手机称为”元素”),每个手机上都贴了一个标签(如上图用颜色标记的部分),记录的是张三的手机、王五的手机等。如果想找王五的手机,则通过 储物柜a[王五]这种方式获取,可以得到王五的手机是 手机z,即储物柜a[王五]的值为手机z。这里储物柜a是一个数组,王五是下标。

再看下图

awk连载9: awk数组的使用 

这里定义了一个数组aa,数组里有4个元素,每个元素上都有一个标签,这个标签叫下标,引用某个元素的时候,通过 数组名[下标名] 来引用,比如aa[x]的值为333。

如果我们要定义数组的话就是通过 数组名[下标名]=值 的方式来定义,其实定义数组的过程就是定义下标的过程,下标可以是数字也可以是字母,如果下标是字母的话必须要用””引起来(值如果是字母的话也需要使用双引号引起来)。

awk连载9: awk数组的使用 

这里定义了数组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 操作}

如果此下标出现在此数组里,则执行打印操作,否则不执行打印操作。

awk连载9: awk数组的使用 

这里判断x是否在数组aa里,如果在则打印OK,因为数组里存在下标x,所以正常打印。

awk连载9: awk数组的使用 

因为下标里不存在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 徐州”

下面我们打印某个元素看看:

awk连载9: awk数组的使用 

练习文件的合并

创建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循环:

 

awk连载9: awk数组的使用 

 

这里用i来循环aa里所有的下标,然后分别打印aa[i],这样就可以遍历所有元素。

当然我们也可以删除某个元素,用delete语句:

awk连载9: awk数组的使用 

这里把元素aa[“x”]删除了,再次遍历所有元素的时候就看不到aa[“x”]的值了。

相关新闻

评论列表(1条)

  • Z的头像
    Z 2024 年 1 月 18 日 上午 1:09

    炒鸡喜欢段老师的文章,简洁干练,简单易懂,段老师YYDS

发表回复

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

                                                                                                                                    RHCE9学习指南连载,点击阅读