Linux高级文本处理之gawk关联数组

Awk 的数组,都是关联数组,即一个数组包含多个”索引/值”的元素。 索引没必要是一系列 连续的数字,实际上,它可以使字符串或者数字,并且不需要指定数组长度。

语法:

arrayname[string]=value

arrayname 是数组名称

string 是数组索引

value 是为数组元素赋的值

访问 awk 数组的元素

如果要访问数组中的某个特定元素,使用 arrayname[index] 即可返回该索引中的值。

实例1:

[root@localhost ~]# awk ' >BEGIN{ item[101]="HD Camcorder"; >item["102"]="Refrigerator"; >item[103]="MP3 Player"; >item["na"]="Young" >print item[101];  >print item["102"];    #注意带引号不带引号awk都视为字符串来处理 >print item[103]; >print item["na"];}'   #字符串索引需要加双引号 HD Camcorder Refrigerator MP3 Player Young

注意:

数组索引没有顺序,甚至没有从 0 或 1 开始.

数组索引可以是字符串,数组的最后一个元素就是字符串索引,即”na”

Awk 中在使用数组前,不需要初始化甚至定义数组,也不需要指定数组的长度。

Awk 数组的命名规范和 awk 变量命名规范相同。

以 awk 的角度来说,数组的索引通常是字符串,即是你使用数组作为索引, awk 也会当 做字符串来处理。下面的写法是等价的:

Item[101]="HD Camcorder" Item["101"]="HD Camcorder" 一、引用数组元素

如果试图访问一个不存在的数组元素, awk 会自动以访问时指定的索引建立该元素,并赋予 null 值。 为了避免这种情况,在使用前最后检测元素是否存在。

使用 if 语句可以检测元素是否存在,如果返回 true,说明改元素存在于数组中。

if ( index in array-name )

实例2:一个简单的引用数组元素的例子

[root@localhost ~]# cat arr.awk  BEGIN {     x = item[55];  #在引用前没有赋任何值,所以在引用是 awk 自动创建该元素并赋 null 值     if ( 55 in item )         print "Array index 55 contains",item[55];     item[101]="HD Camcorder";     if ( 101 in item )         print "Array index 101 contains",item[101];     if ( 1010 in item )  #不存在,因此检查索引值时,返回 false,不会被打印         print "Array index 1010 contains",item[1010]; } [root@localhost ~]# awk -f arr.awk  Array index 55 contains  Array index 101 contains HD Camcorder 二、使用循环遍历 awk 数组

如果要访问数组中的所有元素, 可以使用 for 的一个特殊用法来遍历数组的所有索引:

语法:

for ( var in arrayname ) actions

说明:

var 是变量名称

in 是关键字

arrayname 是数组名

actions 是一系列要执行的 awk 语句,如果有多条语句,必须包含在{ }中。 通过把索引值赋给变量 var,循环体可以把所有语句应用到数组中所有的元素上。

实例1:将数组中元素全部打印出来

[root@localhost ~]# cat arr-for.awk  BEGIN {     item[101]="HD Camcorder";     item[102]="Refrigerator";     item[103]="MP3 Player";     item[104]="Tennis Racket";     item[105]="Laser Printer";     item[1001]="Tennis Ball";     item[55]="Laptop";     item["no"]="Not Available";     for(x in item)  #x 是变量名,用来存放数组索引,无需制定条件,awk自行判断         print item[x]; } [root@localhost ~]# awk -f arr-for.awk  Not Available Laptop HD Camcorder Refrigerator MP3 Player Tennis Racket Laser Printer Tennis Ball 三、删除数组元素

如果要删除特定的数组元素,使用 delete 语句。一旦删除了某个元素,就再也获取不到它 的值了。

语法:

delete arrayname[index];

删除数组内所有元素:

for (var in array) delete array[var]

在 GAWK 中,可以使用单个 delete 命令来删除数组的所有元素:

Delete array

实例1:

[root@localhost ~]# awk ' >BEGIN{item[101]="HD Camcorder"; >item[102]="Refrigerator"; >item[103]="MP3 Player"; >delete item[101]; >print item[101];print item[102]; >for(x in item) delete item[x]; #使用for循环删除全部数组 >print item[102];print item[103];}' Refrigerator [root@localhost ~]#

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/14353.html