如何在awk中定义数组

时间:2014-07-22 05:43:18

标签: arrays awk

我正在通过简单的例子在awk中寻找简单的数组定义。如何定义数组并在awk语言中使用数组的元素?

3 个答案:

答案 0 :(得分:2)

Awk没有数组,但有地图。

与awk中的所有变量一样,不需要定义它。它会在你第一次使用时发生。

分配地图元素:

a[key] = value

使用元素:

print a[key]

迭代:

for (i in a) {
    print i, a[i]
}

如果使用整数作为键,则地图将等效于数组。

答案 1 :(得分:2)

你可以这样做:

awk 'BEGIN {a[1]=50;a[2]=23;a[50]=432}'

答案 2 :(得分:2)

awk中的数组是关联类型,即您也可以使用字符串而不仅仅是数字作为索引值的键。

a[1] = "abc"   ## Valid.
a["x"] = "xyz"  ## Also valid.

可以使用i in a访问数组中的元素,其中i将获取密钥,a是引用的数组。例如:

#!/usr/bin/awk -f
BEGIN {
    a[1] = "abc"
    a["x"] = "xyz"
    for (i in a) {
        print a[i]
    }
}

awk -f script.awk会打印出来:

xyz
abc

您可能会注意到元素访问方式的顺序与保存元素的方式不同。这是因为awk在实现此目的时可以有不同类型的实现。

如果您想确定按顺序访问元素,则必须使用数字键或索引来存储它们:

#!/usr/bin/awk -f
BEGIN {
    a[0] = "abc"
    a[1] = "xyz"
    for (i = 0; i in a; ++i) {
        print a[i]
    }
}

您还可以在使用GNU的awk时配置行为:

  

PROCINFO [ “sorted_in”]

     

如果此元素存在于PROCINFO中,则其值控制顺序   其中数组元素遍历for循环。支持的值   是“@ind_str_asc”,“@ ind_num_asc”,“@ val_type_asc”,“@ val_str_asc”,   “@val_num_asc”,“@ ind_str_desc”,“@ ind_num_desc”,“@ val_type_desc”,   “@val_str_desc”,“@ val_num_desc”和“@unsorted”。价值也可以   是任何比较函数的名称,定义如下:

     

function cmp_func(i1,v1,i2,v2)

     

其中i1和i2是索引,v1和v2是对应的   被比较的两个元素的值。它应该返回一个数字   小于,等于或大于0,取决于元素的方式   数组的排序。