AWK數組


AWK數組

一.數組格式

數組是一個包含一系列元素的表.

格式如下:

    abc[1]=”xiaohong”

    abc[2]=”xiaolan”

 

解釋:

abc      :為數組名稱

[1][2]:為數組元素下標,可以理解為數組的第1個元素、數組的第2個元素

”xiaohong””xiaolan”: 元素內容

 

例子1:定義數組,並且打印數組元素

[root@tab0 ~]# awk 'BEGIN{a[0]="xiaohong";a[1]="xiaolan";print a[0]}'

xiaohong

[root@tab0 ~]# awk 'BEGIN{a[0]="xiaohong";a[1]="xiaolan";print a[1]}'

Xiaolan

 

例子2:打印出所有元素的下標

[root@tab0 ~]# awk 'BEGIN{a[0]="xiaohong";a[1]="xiaolan";for (i in a)print i;}'

0

1

 

解釋:將a定義為循環中的取值列表。從數組中取出的是數組的所有元素的下標

 

例子3:我們將/etc/passwd/ 里邊的第一類定義成數組

 

[root@localhost ~]#:awk -F: '{{a[NR]=$1;}{print NR,a[NR];}}' /etc/passwd

 

例子4:利用數組統計每一個IP的訪問量

[root@tab0 ~]# cat a

192.168.3.1

192.168.3.2

192.168.3.3

192.168.3.4

192.168.3.5

192.168.3.6

192.168.3.7

192.168.3.1

192.168.3.2

192.168.3.3

192.168.3.3

192.168.3.3

192.168.3.2

192.168.3.3

192.168.3.6

192.168.3.6

192.168.3.6

192.168.3.3

192.168.3.2

192.168.3.2

 

解決辦法1:

[root@tab0 ~]# sort a |uniq  -c | sort -nr

      6 192.168.3.3

      5 192.168.3.2

      4 192.168.3.6

      2 192.168.3.1

      1 192.168.3.7

      1 192.168.3.5

      1 192.168.3.4

解決辦法2:

[root@tab0 ~]#  awk '{array[$1]++} END {for(key in array) print array[key],key}' a |sort -k 2 -nr

6 192.168.3.3

5 192.168.3.2

4 192.168.3.6

2 192.168.3.1

1 192.168.3.7

1 192.168.3.5

1 192.168.3.4

 

那我們再來說說上邊例子中的array[$1]++

(1)Awk在讀取第一行的時候,會讀取這個數組,此時的數組是這樣的:a[192.168.3.1]++

(2)此時a[192.168.3.1]的值是未定義的。

但是由於后邊有運算符號++。Awk會將數字0自動賦值給a[192.168.3.1]。然后在做++運算

(3)此時a[192.168.3.1]做++ ,也就是0+1得到的值為1

(4)那么在讀第二個192.168.3.1時,此時a[192.168.3.1]的值已經經過上次運算為1.此時在做一次運算。也就是1+1 現在a[192.168.3.1]的值為2。

(5)總結,最后的值是多少,也就意味着,192.168.3.1運算了多少次,也意味着192.168.3.1出現了多少次。

 

 

 

 

 

 

執行過程就如下:

[root@tab0 ~]# awk '{a[$1]++;print a[$1]}' a

1

1

1

1

1

1

1

2

2

2

3

4

3

5

2

3

4

6

4

5

 

 

 

其實這與let i++ 是同理

[root@tab0 ~]# i=0

[root@tab0 ~]# let i++

[root@tab0 ~]# echo $i

1

[root@tab0 ~]# let i++

[root@tab0 ~]# echo $i

2

[root@tab0 ~]# let i++

[root@tab0 ~]# echo $i

3

 


免責聲明!

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



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