【问题标题】:How to initialize a 2D array in awk如何在 awk 中初始化二维数组
【发布时间】:2016-05-25 20:28:51
【问题描述】:

我正在使用二维数组来保存某些模式的重复次数。例如:

$4 == "Water" {s[$5]["w"]++}
$4 == "Fire" {s[$5]["f"]++}
$4 == "Air" {s[$5]["a"]++}

其中$5 可以是attack1attack2attack3。在END{ } 中,我打印出这些值。但是,其中一些模式不存在。所以对于s["attack1"]["Air"] =0,我的代码打印空格。因此,我想知道在BEGIN{ } 中是否有一种方法可以在一行中初始化数组,而不是初始化我需要的每个元素

  awk -f script.awk data

这是我用来运行我的脚本的命令。我不允许使用任何其他标志。
编辑 1:
这是当前的输出

              Water        Air        Fire
attack1       554                     12
attack2       14           24              
attack3       6                       3

这是我想要的输出:

              Water        Air        Fire
attack1       554          0          12
attack2       14           24         0    
attack3       6            0          3

【问题讨论】:

  • 非常不清楚您想要什么,或者为什么打印空白是坏事,或者如果您不满意为未填充的值获取空白,为什么不只打印填充的值。编辑您的问题以包含一个简洁、可测试的示例,包括示例输入和预期输出以及解释。另外 - 您是否使用支持真正多维数组的 GNU awk 版本?
  • @EdMorton,我添加了当前的输出。而且我相信 GNU 支持真正的多维数组,因为它以应有的方式工作。
  • 如果您切换到二维数组(即 a[i,j])而不是数组数组(即 a[i][j]),可能会容易得多。另请注意,在 awk 中,a[i]++ 是合法的(只要已定义 i),即使 a[i] 尚未初始化,因此通常不需要显式初始化。
  • 好的,你添加了输出。好的。现在添加将产生该输出的输入,您将得到一个我们可以帮助您解决的问题。

标签: arrays multidimensional-array awk initialization


【解决方案1】:

在这种情况下,您不需要初始化数组。 awk 已经有一个默认的空值,所以你只需要改变你打印值的方式。

观察:

awk 'BEGIN {print "Blank:", a[1];
            print "Zero: ", a[1] + 0;
            printf("Blank: %s\n", a[1]);
            printf("Zero: %i\n", a[1])}'

输出:

Blank:
Zero:  0
Blank:
Zero: 0

【讨论】:

    猜你喜欢
    • 2011-12-08
    • 2011-04-12
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    相关资源
    最近更新 更多