6.  数组:
    因为awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key)。值和关键字都存储在内部的一张针对key/value应用hash的表格里。由于hash不是顺序存储,因此在显示数组内容时会发现,它们并不是按照你预料的顺序显示出来的。数组和变量一样,都是在使用时自动创建的,awk也同样会自动判断其存储的是数字还是字符串。一般而言,awk中的数组用来从记录中收集信息,可以用于计算总和、统计单词以及跟踪模板被匹配的次数等等。
    /> cat employees
    Tom Jones       4424    5/12/66         543354
    Mary Adams      5346    11/4/63         28765
    Sally Chang     1654    7/22/54         650000
    Billy Black     1683    9/23/44         336500

    /> awk '{name[x++] = $2}; END{for (i = 0; i < NR; i++) print i, name[i]}' employees    
    0 Jones
    1 Adams
    2 Chang
    3 Black
    在上例中,数组name的下标是变量x。awk初始化该变量的值为0,在每次使用后自增1,读取文件中的第二个域的值被依次赋值给name数组的各个元素。在END模块中,for循环遍历数组的值。因为下标是关键字,所以它不一定从0开始,可以从任何值开始。

#这里是用内置变量NR作为数组的下标了。
    /> awk '{id[NR] = $3}; END {for (x = 1; x <= NR; x++) print id[x]}' employees
    4424
    5346
    1654
    1683

awk中还提供了一种special for的循环,见如下声明:
    for (item in arrayname) {
        print arrayname[item]
    }

    /> cat db
    Tom Jones
    Mary Adams
    Sally Chang
    Billy Black
    Tom Savage
    Tom Chung
    Reggie Steel
    Tommy Tucker

    /> awk '/^Tom/{name[NR]=$1}; END {for(i = 1;i <= NR; i++) print name[i]}' db
    Tom
     Tom
    Tom
     Tommy
    从输出结果可以看出,只有匹配正则表达式的记录的第一个域被赋值给数组name的指定下标元素。因为用NR作为下标,所以数组的下标不可能是连续的,因此在END模块中用传统的for循环打印时,不存在的元素就打印空字符串了。下面我们看看用special for的方式会有什么样的输出。
    /> awk '/^Tom/{name[NR]=$1};END{for(i in name) print name[i]}' db
    Tom
    Tom
    Tommy
    Tom

下面我们看一下用字符串作为下标的例子:(如果下标是字符串文字常量,则需要用双引号括起来)    
    /> cat testfile2
    tom
    mary
    sean
    tom
    mary
    mary
    bob
    mary
    alex
    /> awk '/tom/{count["tom"]++}; /mary/{count["mary"]++}; END{print "There are " count["tom"] \
        " Toms and " count["mary"] " Marys in the file."} testfile2
    There are 2 Toms and 4 Marys in the file.
    在上例中,count数组有两个元素,下标分别为tom和mary,每一个元素的初始值都是0,没有tom被匹配的时候,count["tom"]就会加一,count["mary"]在匹配mary的时候也同样如此。END模块中打印出存储在数组中的各个元素。

    /> awk '{count[$1]++}; END{for(name in count) printf "%-5s%d\n",name, count[name]}' testfile2
    mary 4
    tom  2
    alex 1
    bob  1
    sean 1
    在上例中,awk是以记录的域作为数组count的下标。

    /> awk '{count[$1]++; if (count[$1] > 1) name[$1]++}; END{print "The duplicates were "; for(i in name) print i}' testfile2
    The duplicates were
    mary
    tom
    在上例中,如count[$1]的元素值大于1的时候,也就是当名字出现多次的时候,一个新的数组name将被初始化,最后打印出那么数组中重复出现的名字下标。

之前我们介绍的都是如何给数组添加新的元素,并赋予初值,现在我们需要介绍一下如何删除数组中已经存在的元素。要完成这一功能我们需要使用内置函数delete,见如下命令:
    /> awk '{count[$1]++}; \
        END{for(name in count) {\
                if (count[name] == 1)\
                    delete count[name];\
            } \
            for (name in count) \
                print name}' testfile2
    mary
    tom
    上例中的主要技巧来自END模块,先是变量count数组,如果数组中某个元素的值等于1,则删除该元素,这样等同于删除只出现一次的名字。最后用special for循环打印出数组中仍然存在的元素下标名称。

最后我们来看一下如何使用命令行参数数组,见如下命令:
    /> awk 'BEGIN {for(i = 0; i < ARGC; i++) printf("argv[%d] is %s.\n",i,ARGV[i]); printf("The number of arguments, ARGC=%d\n",ARGC)}' testfile "Peter Pan" 12
    argv[0] is awk.
    argv[1] is testfile.
    argv[2] is Peter Pan.
    argv[3] is 12.
    The number of arguments, ARGC=4
    从输出结果可以看出,命令行参数数组ARGV是以0作为起始下标的,命令行的第一个参数为命令本身(awk),这个使用方式和C语句main函数完全一致。

    /> awk 'BEGIN{name=ARGV[2]; print "ARGV[2] is " ARGV[2]}; $1 ~ name{print $0}' testfile2 "bob"    
    ARGV[2] is bob
    bob
    awk: (FILENAME=testfile2 FNR=9) fatal: cannot open file `bob' for reading (No such file or directory)
    先解释一下以上命令的含义,name变量被赋值为命令行的第三个参数,即bob,之后再在输入文件中找到匹配该变量值的记录,并打印出该记录。
    在输出的第二行报出了awk的处理错误信息,这主要是因为awk将bob视为输入文件来处理了,然而事实上这个文件并不存在,下面我们需要做进一步的处理来修正这个问题。
    /> awk 'BEGIN{name=ARGV[2]; print "ARGV[2] is " ARGV[2]; delete ARGV[2]}; $1 ~ name{print $0}' testfile2 "bob"    
    ARGV[2] is bob
    bob
    从输出结果中我们可以看到我们得到了我们想要的结果。需要注意的是delete函数的调用必要要在BEGIN模块中完成,因为这时awk还没有开始读取命令行参数中指定的文件。

转载于:https://blog.51cto.com/andra/814833

linux 命令详解 十一相关推荐

  1. linux下for命令详解,linux 命令详解 十一

    6.数组:因为awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key).值和关键字都存储在内部的一张针对key/value应用hash的表格里.由于hash不是顺序存储,因此在显示数组 ...

  2. 《Linux命令详解手册》——Linux畅销书作家又一力作

    关注IT,更要关心IT人,让系统管理员以及程序员工作得更加轻松和快乐.鉴于此, 图灵公司引进了国外知名出版社John Wiley and Sons出版的Fedora Linux Toolbox: 10 ...

  3. c linux time微秒_学习linux,看这篇1.5w多字的linux命令详解(6小时讲明白Linux)

    用心分享,共同成长 没有什么比每天进步一点点更重要了 本篇文章主要讲解了一些linux常用命令,主要讲解模式是,命令介绍.命令参数格式.命令参数.命令常用参数示例.由于linux命令较多,我还特意选了 ...

  4. linux下载命令 scp,linux命令详解之scp命令

    作用 scp命令常用于linux之间复制文件和目录. scp是secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令. 格式 从本地复制到远程 复制文件 sc ...

  5. linux中date使用方法,linux命令详解date使用方法(计算母亲节和父亲节日期脚本示例)...

    linux命令详解date使用方法(计算母亲节和父亲节日期脚本示例) 发布于 2016-02-07 15:58:40 | 108 次阅读 | 评论: 0 | 来源: 网友投递 LinuxLinux是一 ...

  6. RAR for Linux 命令详解

    RAR for Linux 命令详解 用法:  rar <命令>-<开关 1> -<开关 N> <压缩文件> <文件...> <@列表 ...

  7. Linux命令详解之 ls

    linux 命令详解 本文主要内容来自Linux man 手册 命令名称: ls ( list files / list directory contents )列举目录内容 命令用法: ls [选项 ...

  8. Linux命令详解之 mv

    linux 命令详解 本文主要内容来自Linux man 手册 命令名称: mv(move)移动/重命名文件 命令用法: mv [选项]... [-T] 源文件 目标文件 mv [选项]... 源文件 ...

  9. Linux命令详解之w命令

    Linux命令详解之w命令 1.命令详解 ··· NAMEw - Show who is logged on and what they are doing. w命令就是用来展示谁在登录,以及他们在做 ...

最新文章

  1. iptables 配置 使用-3
  2. 活学活用,CSS清除浮动的4种方法
  3. linux进程 面试题,Linux面试题,浅析常见Linux命令面试题及答案
  4. 简析TCP的三次握手与四次分手
  5. centos7搜狐 mysql_基于centOS6.7搭建LAMP(httpd-2.4.18+mysql-5.5.47+php-5.6.16)环境
  6. docker java镜像_Springboot整合MongoDB的Docker开发,其它应用也类似
  7. 【CodeForces - 735B】Urbanization (找规律,思维)
  8. [SharePoint 2010] Client Object Model 跨时区查询list item的方法
  9. CLR via C# 内存管理读书记
  10. python修饰器_python修饰器
  11. Android零基础入门第66节:RecyclerView点击事件处理
  12. Windows环境zip版PostgreSQL数据库安装
  13. Reversing Encryption(Reverse函数的应用)
  14. [轉]快速理解VirtualBox的四种网络连接方式
  15. 手机扫描识别车牌,车牌识别
  16. 计算机 统计学考研,统计学考研科目有哪些
  17. python 返回列表长度_Python通过len函数返回对象长度
  18. Python进化算法之多目标优化与代码实战
  19. 聊聊几个阿里 P8、P9 程序员的故事
  20. MongoDB分片集群部署(三)

热门文章

  1. linux系统python截图不显示中文_Linux运维知识之解决linux系统下python中的matplotlib模块内的pyplot输出图片不能显示中文的问题...
  2. python标识运算符_讲解Python中的标识运算符
  3. vb编程转为c语言,C语言,VB编程题
  4. 用c语言描述单链表的数据类型,数据结构—单链表(类C语言描述)
  5. js把word转html在线预览,js实现word转换为html
  6. javascript二维数组转置_VBA数组拆分及维数的转换
  7. Spark详解(十):SparkShuffle机制原理分析
  8. mysql automatic_sp_privileges_mysql variable automatic_sp_privileges 疑问
  9. 纯c语言贪吃蛇,纯C语言贪吃蛇 求助
  10. HTML连载18-id选择器与class区别class选择器使用思路后代选择器