【问题标题】:multidimensional arrays in awkawk 中的多维数组
【发布时间】:2013-01-11 23:38:10
【问题描述】:

我尝试在 awk 中创建一个伪多维数组。

# Calculate cumulative context score

BEGIN { FS=OFS="\t" }

{
        a[$2+FS+$7,$3]+=$6
}

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

}

输出:

awk: ccstscan.awk:9: END { for (i,j) in a
awk: ccstscan.awk:9:             ^ syntax error

这是 GNU awk 手册中提到的内容:

测试一个特定的索引序列是否存在于一个 多维数组,使用与用于 一维数组。将整个索引序列写入 括号,以逗号分隔,作为左操作数:

 (subscript1, subscript2, ...) in array

我尝试修改脚本以创建一个真正的多维数组:

BEGIN { FS=OFS="\t" }

{
    a[$2+FS+$7][$3]+=$6
}

END { for i in a
    {
     for j in a[i]
        { print i,j,a[i][j]
        }

    }
}

我用 gawk 运行它。它也给出了一个错误:

gawk: ccstscan.awk:6:   a[$2+FS+$7][$3]+=$6
gawk: ccstscan.awk:6:              ^ syntax error
gawk: ccstscan.awk:9: END { for i in a
gawk: ccstscan.awk:9:           ^ syntax error
gawk: ccstscan.awk:11:   for j in a[i]
gawk: ccstscan.awk:11:       ^ syntax error
gawk: ccstscan.awk:11:   for j in a[i]
gawk: ccstscan.awk:11:             ^ syntax error
gawk: ccstscan.awk:12:          { print i,j,a[i][j]
gawk: ccstscan.awk:12:                          ^ syntax error

制作和扫描多维关联数组的正确格式是什么

【问题讨论】:

  • 缺少循环(和),它是for (i in a),而不是for i in a。此外,您可能会遇到关于数组索引的第一个语法错误,因为您使用的是较旧的 gawk,真正的多维数组是最近才添加的。
  • 我会在 gawk4 gnu.org/software/gawk/manual/html_node/Arrays-of-Arrays.html 中添加数组数组的链接

标签: multidimensional-array awk gawk


【解决方案1】:

如果您使用模拟的多维数组,您的循环需要是这样的:

  END { 
    for (ij in a) {
      split(ij,indices,SUBSEP);
      i=indices[1];
      j=indices[2];
      print i,j,a[ij]
    }
  }

(i,j) in a 语法仅适用于测试特定索引是否在数组中。它不适用于 for 循环,尽管 for 循环允许类似的语法。

对于真正的多维数组(arrays of arrays),可以这样写:

BEGIN { FS=OFS="\t" }

{ a[$2+FS+$7][$3]+=$6 }

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

但是,数组数组只是在 gawk 4.0 中添加的,所以你的 gawk 版本可能不支持它。

另一个说明:在这一行:

a[$2+FS+$7,$3]+=$6

您似乎正在尝试连接 $2、FS 和 $7,但“+”用于数字加法,而不是连接。你需要这样写:

a[$2 FS $7,$3] += $6

【讨论】:

    猜你喜欢
    • 2011-03-04
    • 2020-10-13
    • 2017-10-12
    • 2019-07-29
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 2021-09-04
    相关资源
    最近更新 更多