awk 陣列為關聯陣列 (關鍵字陣列),索引可為數字或字串,無需宣告大小,元素以 0 或空字串初始化。本文系統整理操作要點。
# 數字索引
arr[1]="cheng mo"
arr[2]="800927"
# 字串索引 (關聯陣列本質)
arr["first"]="cheng"
arr["last"]="mo"
arr["birth"]="800927"
arr[2] 與 arr["birth"] 皆為 "800927",索引型別不同視為不同鍵。
| 函數 | 用途 | 範例 |
|---|---|---|
length(arr) | 陣列長度 / 字串長度 | length(arr) → 4 |
split(str, arr, fs) | 分割字串到陣列,返回長度 | split("a b c", a, " ") → 3 |
asort(arr[, dest]) | 按值排序,重建 1..n 索引 | asort(a,b) → 長度 |
asorti(arr[, dest]) | 按鍵排序,結果存 dest | asorti(a,b) → 長度 |
for (k in arr) print k, arr[k]
# 順序不可預測
n = split(str, arr, " ")
for (i=1; i<=n; i++) print i, arr[i]
# 索引 1..n 保證順序
注意:awk 陣列索引從 1 開始,非 C 風格 0 起始。
awk 'BEGIN{a["x"]="1"; if(a["y"]!="") print "exist"; for(k in a) print k,a[k]}'
# 輸出:exist / x 1 / y (空值鍵被建立!)
in 運算符awk 'BEGIN{a["x"]="1"; if("y" in a) print "exist"; for(k in a) print k,a[k]}'
# 輸出:x 1 (無 y 鍵)
delete arr["key"] # 刪除單一鍵
delete arr # 刪除整個陣列 (gawk 4.0+)
awk 底層為一維,以 SUBSEP (預設 \034) 連接多維索引:
arr[2,4] = 1 # 實際鍵為 "2\0344"
awk 'BEGIN{
for(i=1;i<=9;i++)
for(j=1;j<=9;j++)
arr[i,j]=i*j
for(k in arr) {
split(k, idx, SUBSEP)
print idx[1]"*"idx[2]"="arr[k]
}
}'
if ((i,j) in arr) print "exists"
必須用括號 包裹多維索引。
sort 或外部工具掌握關聯陣列特性與 in/delete/split/SUBSEP 核心操作,即可駕馭 awk 複雜資料結構處理。