天天看點

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

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