AWK - if条件计算数组输入

时间:2016-06-24 23:11:07

标签: awk gawk

问题

所以我有以下代码行:

None

if (sum[msg,h]/summsg[msg,h] != 0) printf ("%9.2f\n",sum[msg,h]/summsg[msg,h]) 是一个消息数组,包含10个不同的值 msg保留日志文件中存在的所有小时数。 hr数组是一个字段的值(sum[]) 并且sum[$5,$3] += $11数组正在计算行数(summsg[]

这会重新调整summsg[$5,$3]++错误,但我希望fatal: division by zero attempted评估awk,然后继续。

我还尝试使用以下代码检查每个值:

sum[msg,h]/summsg[msg,h] != 0

但这是停止我的小时计算,因为我认为它在00-09小时内领先0并返回假。

如果需要,我可以提供完整的代码。

有什么想法吗?

评论更新

根据评论,它们是拼写错误,纠正了它们并且它们没有任何区别。

示例输入文件

if (sum[msg,h] != 0 || summsg[msg,h] != 0)
printf ("%9.2f\n",sum[msg,h]/summsg[msg,h])
  

这是一个弥补的输入文件

反映输入文件的代码如下:

message1 01 10
message2 01 01
message2 01 05
message1 01 15
message1 01 05
message1 02 03
message1 02 06
message2 02 10
message2 02 20
message2 02 05

1 个答案:

答案 0 :(得分:3)

对于您的MCVE代码,问题是您在加载数组时使用0102为数组编制索引,但尝试使用1或{{1}提取数据}(没有前导零)。你必须解决这个问题。例如:

2

对于样本输入,输出变为:

{
  msg_type[$1]++
  sum[$1,$2] += $3
  summsg[$1,$2]++
  #print "type:", $1, "hr:", $2, "value:", $3
}
END {
  for (msg in msg_type) {
    print msg
    for (i = 0; i <= 23; i++) {
      if (i < 10)
        h = "0" i
      else
        h = i
      #print "  ", msg, h, sum[msg,h], summsg[msg,h]
      if (sum[msg,h] != 0 || summsg[msg,h] != 0)
        printf("%9.2f\n", sum[msg,h]/summsg[msg,h])
    }
  } 
}

我认为您应该打印小时,但这是您的选择。