awk 數組執行個體
awk的數組,一種關聯陣列(Associative Arrays),下標可以是數字和字串。因無需對數組名和元素提前聲明,也無需指定元素個數 ,所以awk的數組使用非常靈活。
首先介紹下幾個awk數組相關的知識點:
<1>建立數組
array[index] = value :數組名array,下標index以及相應的值value。
<2>讀取數組值
{ for (item in array) print array[item]} # 輸出的順序是隨機的
{for(i=1;i<=len;i++) print array[i]} # Len 是數組的長度
<3>多維陣列,array[index1,index2,……]:SUBSEP是數組下標分割符,預設為“\034”。可以事先設定SUBSEP,也可以直接在SUBSEP的位置輸入你要用的分隔字元,如:
awk 'BEGIN{SUBSEP=":";array["a","b"]=1;for(i in array) print i}'
a:b
awk 'BEGIN{array["a"":""b"]=1;for(i in array) print i}'
a:b
但,有些特殊情況需要避免,如:
awk 'BEGIN{
SUBSEP=":"
array["a","b:c"]=1 # 下標為“a:b:c”
array["a:b","c"]=2 #下標同樣是“a:b:c”
for (i in array) print i,array[i]}'
a:b:c 2 #所以數組元素只有一個。
<4>刪除數組或數組元素: 使用delete 函數
delete array #刪除整個數組
delete array[item] # 刪除某個數組元素(item)
<5> 排序:awk中的asort函數可以實現對數組的值進行排序,不過排序之後的數組下標改為從1到數組的長度。在gawk 3.1.2以後的版本還提供了一個asorti函數,這個函數不是依據關聯陣列的值,而是依據關聯陣列的下標排序,即asorti(array)以後,仍會用數字(1到數組長度)來作為下標,但是array的數組值變為排序後的原來的下標,除非你指定另一個參數如:asorti(a,b)。(非常感謝lionfun對asorti的指正和補充)
cat test
2 d
3 t
6 a
8 b
g u
m c
0 d
5 e
awk '{a[$1]=$2;}END{len=asorti(a); for(i=1;i<=len;i++) print i,a[i]}' test
1 0
2 2
3 3
4 5
5 6
6 8
7 g
8 m
awk '{a[$1]=$2;}END{len=asorti(a,b); for(i=1;i<=len;i++) print i,b[i],a[b[i]]}' test #利用asort函數對數組a的值排序,同時獲得數組長度len
1 0 d
2 2 d
3 3 t
4 5 e
5 6 a
6 8 b
7 g u
8 m c
原文:
http://www.51testing.com/?uid-363787-action-viewspace-itemid-242169