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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM