awk数组简介
一、定义
在 awk 中,数组是关联数组,它的特点是:
1、 数组的下标可以是整数,也可以是负数甚至是字符串
2、 数组的下标可以不连续。
Awk 的变量 IGNORECASE 的值不影响数组下标。
当 awk 创建一个数组的时候,如果没有指定下标,默认已连续整数作为下标,起始值是 1.
Awk 的数组是什么高效的,访问一个元素的时间跟元素的数量无关。
注: awk 的下标其实都是字符串,如我们输入的是数字 1 , awk 会自动的转换为字符串“ 1 ”。
二、引用元素
引用 awk 元素的基本方法是:
ARRAY[INDEX]
注: 在此引用方式中除非 [ ] 中写的是变量,否则需要添加双引号,即字符串必需添加双引号的规则在数组的下标中也必需遵守,但如果下标是全数字,则可以不加引号,例:
Bb=“123”
arr[bb] awk 将 bb 认作变量,获取的是 arr[“123”] 的值
arr[234] awk 将 234 认作字符串,虽然 234 没加引号。因为变量的定义不能用全数字,所以 234 肯定是字符串,而不是变量。
arr[“ bb” ] awk 将 bb 认作字符串,获取的是 arr[“bb”] 的值
有时候,数组的 value 会为空。 value 为空的元素包含两种情况: 1 、本身 value 为空; 2 、通过 delete 删除后的元素。这两种情况都可以被正常引用。但不幸的是,如果引用了一个不存在的元素,会导致 awk 创建这个元素, value 为空,这样,会导致 awk 的内存浪费。
如果要查询具有某个 index 值的元素是否存在可以用如下的表达式:
INDEX in ARRAY
这个表达式仅仅测试具有 INDEX 的元素在 ARRAY 中是否存在。如果不存在,该表达式不会导致产生以 INDEX 为下标的 value 为空的元素。
如果元素存在,该表达式返回值 1 ( true )
反之,返回 0 ( false )
例:测试在数组 frequencies 中是否存在下标为 2 的元素
if (2 in frequencies)
print “Sub 2 is present.”
注: 不能测试 frequencies 中是否存在 value 为 2 的元素,除非 scan 数组中的所有元素。
三、给元素赋值
给 awk 的数组赋值,只能采用如下形式:
ARRAY[SUB] = VALUE
ARRAY :数组名字
SUB :下标
VALUE :值
注: awk 可以生成下标为空的元素,但是引用方式必需是 arr[ “” ], 而不是 arr[]。
length(a) 求得数组中元素的个数。
四、遍历数组
在使用数组的程序里,经常会使用一个循环让数组里的每一个元素都执行一次某一个操作。在其他程序里,数组的下标是连续的正整数,因此所有的下标很容易通过从低到高实现遍历。但这个方法在 awk 里不能使用,因为 awk 的下标可以是数字也可以是字符串。因此, awk 使用一种特别的语句来遍历数组里的元素:
for (VAR in ARRAY)
BODY
以上的循环将实现让数组 ARRAY 里的每一个元素都执行一次 BODY 。
以下程序的第一部分,将输入文本的每一个单词都作为下标存放入数组,如单词有重复,仅仅保留一个,因数组的下标是不能重复的。
五、删除元素
删除单个元素
delete ARRAY[INDEX]
删除整个数组方法 1
for (VAR in ARRAY)
delete ARRAY[VAR]
删除整个数组方法 2 (该方法 gawk 专用,可移植性差,但效率是方法 1 的 3 倍左右)
delete ARRAY
Awk 的数组和变量用的是同一个地址空间,数组的名字和变量不能重名。即使数组删除了也不能将名字用于变量命名,以下命令会报错:
a[1] = 3; delete a; a = 3
六、数组赋值
单个赋值: Tarray[1]="cheng mo" Tarray[2]="800927"
多个赋值:awk 'BEGIN{info="it is a test"; lens=split(info,tA," "); print length(tA), lens, tA[1];}'
原文:
http://blog.csdn.net/xrzs1986/article/details/6261926