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

Har*_*rma 8 array 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]
  }'
Run Code Online (Sandbox Code Playgroud)

上面的命令输出 的最新设置值arr['subscript'],在这种情况下10,是arr[Q]之前的值,print而不是8的值arr[J]

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

Kus*_*nda 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"]
    }'
Run Code Online (Sandbox Code Playgroud)

使用单独的键和值:

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"]
    }'
Run Code Online (Sandbox Code Playgroud)

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

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

还相关:


顺便说一句,您可以编写这样的“纯awk脚本”:

#!/usr/bin/awk -f

BEGIN { 
   # some initialisations
}

some_expression { some code }

END {
    # more here
}
Run Code Online (Sandbox Code Playgroud)