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 ~]#