zoukankan      html  css  js  c++  java
  • awk数组简介

    一、定义

    在 awk 中,数组是关联数组,它的特点是:

    1、 数组的下标可以是整数,也可以是负数甚至是字符串

    2、 数组的下标可以不连续。

    Awk 的变量 IGNORECASE 的值不影响数组下标。

    当 awk 创建一个数组的时候,如果没有指定下标,默认已连续整数作为下标,起始值是 1.

    Awk 的数组是什么高效的,访问一个元素的时间跟元素的数量无关。

    注: awk 的下标其实都是字符串,如我们输入的是数字 1 awk 会自动的转换为字符串“ 1 ”

    二、引用元素

    引用 awk 元素的基本方法是:

    ARRAY[INDEX]

    注: 在此引用方式中除非 [ ] 中写的是变量,否则需要添加双引号,即字符串必需添加双引号的规则在数组的下标中也必需遵守,但如果下标是全数字,则可以不加引号,例:

    Bb=“123”

    arr[bb] awk bb 认作变量,获取的是 arr[“123”] 的值

    arr[234] awk 234 认作字符串,虽然 234 没加引号。因为变量的定义不能用全数字,所以 234 肯定是字符串,而不是变量。

    arr[“ bb” ] awk bb 认作字符串,获取的是 arr[“bb”] 的值

    有时候,数组的 value 会为空。 value 为空的元素包含两种情况 1 、本身 value 为空 2 、通过 delete 删除后的元素。这两种情况都可以被正常引用。但不幸的是,如果引用了一个不存在的元素,会导致 awk 创建这个元素, value 为空,这样,会导致 awk 的内存浪费。

    如果要查询具有某个 index 值的元素是否存在可以用如下的表达式:

    INDEX in ARRAY

    这个表达式仅仅测试具有 INDEX 的元素在 ARRAY 中是否存在。如果不存在,该表达式不会导致产生以 INDEX 为下标的 value 为空的元素。

    如果元素存在,该表达式返回值 1 true

    反之,返回 0 false

    例:测试在数组 frequencies 中是否存在下标为 2 的元素

    if (2 in frequencies)

    print “Sub 2 is present.”

    注: 不能测试 frequencies 中是否存在 value 2 的元素,除非 scan 数组中的所有元素。

    三、给元素赋值

    给 awk 的数组赋值,只能采用如下形式:

    ARRAY[SUB] = VALUE

    ARRAY :数组名字

    SUB :下标

    VALUE :值

    注: awk 可以生成下标为空的元素,但是引用方式必需是 arr[ “” ], 而不是 arr[]

    length(a) 求得数组中元素的个数。

    四、遍历数组

    在使用数组的程序里,经常会使用一个循环让数组里的每一个元素都执行一次某一个操作。在其他程序里,数组的下标是连续的正整数,因此所有的下标很容易通过从低到高实现遍历。但这个方法在 awk 里不能使用,因为 awk 的下标可以是数字也可以是字符串。因此, awk 使用一种特别的语句来遍历数组里的元素:

    for (VAR in ARRAY)

    BODY

    以上的循环将实现让数组 ARRAY 里的每一个元素都执行一次 BODY

    以下程序的第一部分,将输入文本的每一个单词都作为下标存放入数组,如单词有重复,仅仅保留一个,因数组的下标是不能重复的。

    五、删除元素

    删除单个元素

    delete ARRAY[INDEX]

    删除整个数组方法 1

    for (VAR in ARRAY)

    delete ARRAY[VAR]

    删除整个数组方法 2 (该方法 gawk 专用,可移植性差,但效率是方法 1 3 倍左右)

    delete ARRAY

    Awk 的数组和变量用的是同一个地址空间,数组的名字和变量不能重名。即使数组删除了也不能将名字用于变量命名,以下命令会报错:

    a[1] = 3; delete a; a = 3

    六、数组赋值

    单个赋值: Tarray[1]="cheng mo"  Tarray[2]="800927"

    多个赋值:awk 'BEGIN{info="it is a test"; lens=split(info,tA," "); print length(tA), lens, tA[1];}'

    原文:

    http://blog.csdn.net/xrzs1986/article/details/6261926

  • 相关阅读:
    Springboot 之 自定义配置文件及读取配置文件
    SQLSERVER系统视图 sql server系统表详细说明
    MySQL Workbench建表时 PK NN UQ BIN UN ZF AI 的含义
    使用Ecplise git commit时出现"There are no stages files"
    maven添加sqlserver的jdbc驱动包
    java将XML文档转换成json格式数据
    java将XML文档转换成json格式数据
    cannot be resolved. It is indirectly referenced from required .class files
    org.codehaus.jackson.map.JsonMappingException: Can not construct instance of java.util.Date from String value '2012-12-12 12:01:01': not a valid representation (error: Can not parse date "2012-12-
    @Autowired注解和静态方法 NoClassDefFoundError could not initialize class 静态类
  • 原文地址:https://www.cnblogs.com/mydomain/p/2827257.html
Copyright © 2011-2022 走看看