一、定義
在 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