awk数组awk详解

awk数组awk详解

awk的数组非常灵活,灵活到你几乎可以随心所欲😁

awk有几个有趣的特征
1.当一个变量的值为字符串(或空字符串)时,该变量仍可进行数学运算此时该(空)字符串被当作数字0来处理
root@bwhhkle:~# awk 'BEGIN{a="hello";print a,a++}'
hello 0
你可能会说上面输出为什么是0而不是1,因为a++是后计算,如下:
root@bwhhkle:~# awk 'BEGIN{a="hello";print a,a++,a}'
hello 0 1
如果你不想麻烦的话用++a即可,如下:
root@bwhhkle:~# awk 'BEGIN{a="hello";print a,++a,a}'
hello 1 1
2.直接引用一个 数组中不存在的元素 的时候,awk会自动创建此元素 ,并且为其赋值为 空字符串
root@bwhhkle:~# awk 'BEGIN{a[b];print a[b];a[b]++;print a[b]}'

1
由此得知,空字符串在参与"自加运算"的时候,也是被当成了数字0来使用,自加后变为了1
3.由上推出,当我们对一个不存在的元素进行自加运算的时候,这个元素的值就变成了自加运算的次数
root@bwhhkle:~# awk 'BEGIN{a[b];print a[b];a[b]++;a[b]++;print a[b]}'

2
这个特性很实用...
4.遍历数组名称时候,获得的是数组的下标值(或索引值)
... ++a[$i];for(j in a)print j,a[j] ...
j的值即为$i的取值

案例:
统计重复出现的字段或字符
root@bwhhkle:~# cat xx
1 a
2 a
2 b
3 c
4 c
4 b
5 c
root@bwhhkle:~# awk '{a[$2]++}END{for(i in a){print a[i],i}}' xx
2 a
2 b
3 c
以上是统计第二列重复出现的字符串和次数;如果不输出次数,那么即是实现把第二列去重