• linux基础学习-18.10-awk数组


    1、awk数组

    awk提供了数组来存放一组相关的值。

    awk是一种编程语言,肯定也支持数组的运用,但是又不同于c语言的数组。数组在awk中被称为关联数组,因为它的下标既可以是数字也可以是字符串。下标通常被称作key,并且与对应的数组元素的值关联。数组元素的key和值都存储在awk程序内部的一张表中,通过一定散列算法来存储,所以数组元素都不是按顺序存储的。打印出来的顺序也肯定不是按照一定的顺序,但是我们可以通过管道来对所需的数据再次操作来达到自己的效果。

    如图不难发现,awk数组就和酒店一样。数组的名称就像是酒店名称,数组元素名称就像酒店房间号码,每个数组元素里面的内容就像是酒店房间里面的人。

    2、图片-数组

    假设我们有一个酒店

    酒店<===>oldboyhotel
    

    酒店里面有几个房间110,119,120,114这几个房间

    酒店110房间<===>oldboyhotel[110]
    酒店120房间<===>oldboyhotel[120]
    酒店119房间<===>oldboyhotel[119]
    酒店114房间<===>oldboyhotel[114]
    

    酒店房间里面入住客人

    酒店110房间住着xiaoyu<===>oldboyhotel[110]="xiaoyu"
    酒店119房间住着ruxue<===>oldboyhotel[119]="ruxue"
    酒店120房间住着dandan<===>oldboyhotel[120]="dandan"
    酒店114房间住着waiwai<===>oldboyhotel[114]="waiwai"
    

    例子:

    [root@oldboy ~]# awk 'BEGIN{oldboyhotel[110]="xiaoyu";oldboyhotel[119]="ruxue";oldboyhotel[120]="dandan";oldboyhotel[114]="waiwai";print oldboyhotel[110],oldboyhotel[119],oldboyhotel[120],oldboyhotel[114]}'
    xiaoyu ruxue dandan waiwai
    
    [root@oldboy ~]# awk 'BEGIN{oldboyhotel[110]="xiaoyu";oldboyhotel[119]="ruxue";oldboyhotel[120]="dandan";oldboyhotel[114]="waiwai";for(hotel in oldboyhotel)print hotel,oldboyhotel[hotel]}'
    110 xiaoyu
    120 dandan
    114 waiwai
    119 ruxue
    

    企业面试题:统计域名访问次数

    处理以下文件内容,将域名取出并根据域名进行计数排序处理:(百度和sohu面试题)

    http://www.etiantian.org/index.html
    http://www.etiantian.org/1.html
    http://post.etiantian.org/index.html
    http://mp3.etiantian.org/index.html
    http://www.etiantian.org/3.html
    http://post.etiantian.org/2.html
    

    思路:

    1)以斜线为菜刀取出第二列(域名)

    2)创建一个数组

    3)把第二列(域名)作为数组的下标

    4)通过类似于i++的形式进行计数

    5)统计后把结果输出

    过程演示:

    第一步:查看一下内容

    [root@oldboy ~]# awk -F "[/]+" '{print $2}' file 
    www.etiantian.org
    www.etiantian.org
    post.etiantian.org
    mp3.etiantian.org
    www.etiantian.org
    post.etiantian.org
    

    命令说明:

    这是我们需要计数的内容

    第二步:计数

    [root@oldboy ~]# awk -F "[/]+" '{i++;print $2,i}' file 
    www.etiantian.org 1
    www.etiantian.org 2
    post.etiantian.org 3
    mp3.etiantian.org 4
    www.etiantian.org 5
    post.etiantian.org 6
    

    命令说明:

    i++:i最开始是空的,当awk读取一行,i自身+1

    第三步:用数组替换i

    [root@oldboy ~]# awk -F "[/]+" '{h[$2]++;print $2,h["www.etiantian.org"]}' file 
    www.etiantian.org 1
    www.etiantian.org 2
    post.etiantian.org 2
    mp3.etiantian.org 2
    www.etiantian.org 3
    post.etiantian.org 3
    

    命令说明:

    1)将i替换成h[$2];相当于我创建了一个数组h[],然后用$2作为我的房间号。但是目前房间里是没有东西的。也就是说h[$2]=h["www.etiantian.org"] and h["post.etiantian.org"] and h["mp3.etiantian.org"] 但是具体房间里是没有东西的也就是空。

    2)h[$2]++就等于i++:也就是说我开始给房间里加东西;当出现同样的东西,我就++

    3)print h["www.etiantian.org"]:意思就是说我开始要输出了。我要输出的是房间号为“www.etiantian.org”里面的内容。这里面的内容最早是空的,随着awk读取每一行一旦出现房间号为“www.etiantian.org”的房间时,我就给房间里的内容进行++。

    4)综上,输出的结果中,每次出现www.etiantian.org时,h["www.etiantian.org"]就会++。因此最后的输出数字是3

    第四步:输出最终计数结果

    [root@oldboy ~]# awk -F "[/]+" '{h[$2]++}END{for(i in h)print i,h[i]}' file 
    mp3.etiantian.org 1
    post.etiantian.org 2
    www.etiantian.org 3
    

    命令说明:

    我们最终需要输出的是去重复以后的统计结果,所以得在END模块里进行输出

    for(i in h)遍历这个数组,i里存的都是房间号

    print i,h[i]:输出每一个房间号及其房间里的内容(计数结果)

    提示:

    awk的应用里最重要的一个功能就是计数,而数组在awk里最大的作用就是去重复。请同学们仔细理解,多动手试验一下。

    练习题:

    1、什么是awk数组及数组的结构组成

    2、统计域名访问次数

  • 相关阅读:
    ATOM编辑器插件
    说说关于IE浏览器兼容性
    git命令
    Vue js 的生命周期详解
    Flexbox 布局教程
    到底vuex是什么?
    CSS3 动画 animation和@keyframes
    zabbix添加触发器Triggers
    zabbix邮件报警
    修改zabbix监控项刷新时间
  • 原文地址:https://www.cnblogs.com/Klanti/p/9143720.html
Copyright © 2020-2023  润新知