通过字符串引用数组元素,并在 awk 中初始化数组

通过字符串引用数组元素,并在 awk 中初始化数组
#!/usr/bin/env bash
awk '
  BEGIN {
    arr[A]=1;
    arr[B]=1;
    arr[C]=1;
    arr[E]=1;
    arr[J]=8;
    arr[Q]=10;
    print arr[J]
  }'

上述命令输出 的最新设置值arr['subscript'],在本例中10arr[Q]之前的值print,而不是8的值arr[J]

另外,就像上面的脚本一样,我不想一次一行地为arr['A'], arr['B'], arr['C'] and arr['E']具有相同值的值分配值1,而是将一组下标作为参数之一并将公共值作为另一个参数传递给处理该函数的函数为它们分配价值的逻辑。

答案1

数组索引可以是整数,也可以是带引号的字符串awk。您在这里所做的是使用尚未初始化的变量。因此它们的值是空的。

您将获得分配给数组的最新值,因为每次分配都会覆盖以前的值。使用print arr[""]也会给你10回报。

相反,请使用字符串,如arr["A"]=1.

对于您的上一个问题:没有真正的工具可以awk从命令行初始化数组,但是您可以传递一个“编码”值,您可以在块中“解码” BEGIN(例如)以提取数组的键和值。

将特殊分隔的列表作为单个字符串传递并解析它以提取要使用的索引和值的示例:

awk -v vals="A=1:B=1:C=1:E=1:J=8:Q=10" '
    BEGIN {
        n = split(vals, v, ":")
        for (i = 1; i <= n; ++i) {
            split(v[i], a, "=")
            arr[a[1]] = a[2]
        }

        print arr["J"]
    }'

使用单独的键和值:

awk -v keys="A:B:C:E:J:Q" -v vals="1:1:1:1:8:10" '
    BEGIN {
        nk = split(keys, k, ":")
        nv = split(vals, v, ":")

        if (nk != nv) exit 1

        for (i = 1; i <= nk; ++i)
            arr[k[i]] = v[i]

        print arr["J"]
    }'

这是一种将“数组”传递到 的相当有限的方法awk,但它适用于可以完全控制的简单值。对于在实际数据中嵌入冒号(以及第一个示例的等号)的任何数据,这些示例都会中断。

像这样传递数据也意味着数据中的反斜杠必须进行特殊处理(\n将是换行符,因此要传递两个字符串\n,您必须使用"\\\n"or '\\n')。

相关内容:


顺便说一句,您可以编写一个“纯awk脚本”,如下所示:

#!/usr/bin/awk -f

BEGIN { 
   # some initialisations
}

some_expression { some code }

END {
    # more here
}

相关内容