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

posted @ 2012-12-20 23:03  浪里飞  阅读(6259)  评论(0编辑  收藏  举报