awk数组

2022-09-07 11:16:38 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

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

例子5:解释一下awk解决去重问题

[root@tab0 ~]# awk ‘! a[$1] ’ 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

其实要解释这个问题,只需要弄清楚awk中的“真”与“假”。

在awk中,以下3种情况是“假”,其他情况都为“真”

1) 数字 0

2) 空字符串

3) 未定义的值

[root@tab0 ~]# awk ‘BEGIN{a=0;if(a) print “true”;else print “false”}’

False

[root@tab0 ~]# awk ‘BEGIN{a=””;if(a) print “true”;else print “false”}’

False

[root@tab0 ~]# awk ‘BEGIN{if(a) print “true”;else print “false”}’

False

以上的个例子说明了只要a的值为数字0、空字符串、未定义的值都为假,也就是条件都不成立

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/154860.html原文链接:https://javaforall.cn

0 人点赞