• 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

  • 相关阅读:
    洛谷 P1628 合并序列
    洛谷 P3378 【模板】堆
    浅谈可删除堆
    浅谈数据结构—分块
    浅谈对顶堆
    JDOJ 1929: 求最长不下降序列长度
    JDOJ 1928: 排队买票
    Leetcode(53)-最大子序和
    Leetcode(38)-报数
    Leetcode(35)-搜索插入位置
  • 原文地址:https://www.cnblogs.com/pangbing/p/7015745.html
Copyright © 2020-2023  润新知