array[index] = value :數組名array,下標index以及相應的值value。
<2>讀取數組值[code]
{ 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的位置輸入你要用的分隔符,如:
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 #所以數組元素只有一個。
delete array #刪除整個數組
delete array[item] # 刪除某個數組元素(item)
awk '!($0 in a){a[$0];print}' file(s)
aaa 1
ccc 1
aaa 1
bbb 1
ccc 1" |awk '{a[$1]+=$2}END{for(i in a) print i,a[i]}'
aaa 3
bbb 1
ccc 2
cat file1
aaa
bbb
ccc
ddd
cat file2
aaa
eee
ddd
fff
awk 'NR==FNR{a[$0]=1;print} #讀取file1,建立數組a,下標爲$0,並賦值爲1,然後打印
NR>FNR{ #讀取file2
if(!(a[$0])) {print } #如果file2 的$0不存在於數組a中,即不存在於file1,則打印。
}' file1 file2
aaa
bbb
ccc
ddd
eee
fff
NR>FNR{ #讀取file1
if(!(a[$0])) {print } #如果file1 的$0不存在於數組a中,即不存在於file2,則打印。
}' file2 file1
bbb
ccc
1
0
b
2
10
8
100" |
awk '{a[$0]=$0} #建立數組a,下標爲$0,賦值也爲$0
END{
len=asort(a) #利用asort函數對數組a的值排序,同時獲得數組長度len
for(i=1;i<=len;i++) print i "\t"a[i] #打印
}'
1 0
2 1
3 2
4 8
5 10
6 100
7 a
8 b
c[j++]=$1}
END{
for(m=0;m<j;m++)print c[m],a[c[m]]
}'
<例1>:
cat file1
g1.1 2
g2.2 4
g2.1 5
g4.1 3
cat file2
g1.1 2
g1.2 3
g4.1 4
cat file3
g1.2 3
g5.1 3
g1.2 - 3 3
g2.2 4 - -
g2.1 5 - -
g4.1 3 4 -
g5.1 - - 3
awk '{a[ARGIND" "$1]=$2 # ARGIND是當前命令行文件的位置(從0開始),將它和第一列的value作爲下標,建立數組a。
b[$1] #將第一列的value作爲下標,建立數組b,目的是在讀完所有文件之後,能得到第一列value的uniqe-list。
}
END{
for(i in b) {
printf i" "
for(j=1;j<=ARGIND;j++) printf "%s ", a[j" "i]?a[j" "i]:"-" #此時的ARGIND值爲3.
print ""
}
}' file1 file2 file3
當然,我們也可以利用另外一個內置變量FILENAME來完成相同的任務(大家可以先想想怎麼寫),如下:
awk '{a[FILENAME" "$1]=$2;b[$1];c[FILENAME]}END{for(i in b) {printf i" ";for(j in c) printf "%s ", a[j" "i]?a[j" "i]:"-";print""}}' file1 file2 file3
b[$1]
}
END{
for(i in b) {
printf i" "
for(j=2;j<=ARGIND;j+=2) printf "%s ", a[j" "i]?a[j" "i]:"-" # 由於FS的設置也是有對應ARGIND值,所以對ARGIND稍作改動。
print ""
}
}' FS="|" file1 FS="#" file2 FS="@" file3 # 對每個文件分別設置FS的值。
FILENAME=="file1"{FS="|"} # 設置FS
FILENAME=="file2"{FS="#"} #設置FS
FILENAME=="file3"{FS="@"} #設置FS
# 稍顯繁瑣,不過一目瞭然
{$0=$0} #使FS生效。
{a[ARGIND" "$1]=$2; b[$1]}
END{ for(i in b) {printf i" "; for(j=1;j<=ARGIND;j++) printf "%s ", a[j" "i]?a[j" "i]:"-"; print ""}
}' file1 file2 file3
1 2 3 4 5 6
2 3 4 5 6 1
3 4 5 6 1 2
4 5 6 1 2 3
Outputfile
4 3 2 1
5 4 3 2
6 5 4 3
1 6 5 4
2 1 6 5
3 2 1 6
if (max_nf < NF)
max_nf = NF # 數組第一維的長度
max_nr = NR # 數組第二維的長度
for (x = 1; x <= NF; x++)
vector[x, NR] = $x #建立數組vector
}
END {
for (x = 1; x <= max_nf; x++) {
for (y = max_nr; y >= 1; --y)
printf("%s ", vector[x, y])
printf("\n")
}
}'
有兩個文本a和b,要求輸出c文本,合併的規則是按照第一行的headline(按字母順序)合併文本a和b,空缺按“0”補齊。
a b c d
1 2 9 7
4 5 8 9
5 3 6 1
cat b.txt
a e f d g
9 2 4 7 3
4 3 7 9 4
cat c.txt
a b c d e f g
1 2 9 7 0 0 0
4 5 8 9 0 0 0
5 3 6 1 0 0 0
9 0 0 7 2 4 3
4 0 0 9 3 7 4
FNR==1{ #FNR==1,即a和b文本的第一行,這個用的真的很巧妙。
for(i=1;i<=NF;i++){
b[i]=$i #讀取文本的每個元素存入數組b
c[$i]++} #另建立數組c,並統計每個元素的個數
next #可以理解爲,讀取FNR!=1的文本內容。
}
{k++ # 統計除去第一行的文本行數
for(i=1;i<=NF;i++)a[k","b[i]]=$i #利用一個二維數組來保持每個數字的位置, k,b[i]可以理解爲每個數字的座標。
}
END{
l=asorti(c) #利用asorti函數對數組的下標進行排序,並獲取數組長度,即輸出文件的列數(NF值)
for(i=1;i<=l;i++)printf c[i]" " # 先打印第一行,相當於headline。
print ""
for(i=1;i<=k;i++){
for(j=1;j<=l;j++)printf a[i","c[j]]?a[i","c[j]]" ":"0 " # 打印二維數組的值。
print ""}
}' a.txt b.txt
打印某個關鍵字前幾行,以3行爲例:
7
8
9
echo 'abcd' |awk '{len=split($0,a,"");for(i=1;i<=len;i++) print "a["i"] = " a[i];print "length = " len}'
a[1] = a
a[2] = b
a[3] = c
a[4] = d
length = 4
3
<2> 下標設爲變量或函數:
index : 23
value : 1
awk 'BEGIN{a["1"] = 3; delete a;a=3;print a}' #即使你已經使用了delete函數。
awk: fatal: attempt to use array `a' in a scalar context
gawk '{ match($0, /(fo+).+(bar*)/, arr) #匹配到的部分自動賦值到arr中,下標從1開始
print arr[1], arr[2]
print arr[1, "start"], arr[1, "length"] #二維數組arr[index,"start"]值=RSTART
print arr[2, "start"], arr[2, "length"] #二維數組arr[index,"length"]值=RLENGTH
}'
foooo barrrrr
1 5
9 7
split("abc",array,"")
print "array[1] = "array[1],"\narray[2] = "array[2],"\narray[3] = "array[3]
split("",array)
print "array[1] = "array[1],"\narray[2] ="array[2],"\narray[3] ="array[3]
}'
array[1] = a
array[2] = b
array[3] = c
array[1] =
array[2] =
array[3] =