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


8
#!/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'],在这种情况下10,它是arr[Q]之前的值,print而不是。8arr[J]

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

Answers:


16

数组索引是中的整数或带引号的字符串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"'\\n')。

也相关:


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

#!/usr/bin/awk -f

BEGIN { 
   # some initialisations
}

some_expression { some code }

END {
    # more here
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.