AWK - 执行 if 条件计算数组输入

AWK - does an if condition calculate an array input

问题

所以我有下面一行代码:

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

msg 是一个包含 10 个不同值的消息数组 hr 保存日志文件中存在的所有时间。 sum[] 数组是将字段 (sum[,] += ) 的值加在一起 summsg[] 数组正在计算行数 (summsg[,]++)

这是重新调整 fatal: division by zero attempted 错误,但我认为 awk 会计算 sum[msg,h]/summsg[msg,h] != 0 然后继续。

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

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

但这会停止我的小时计算,因为我认为它会在 00-09 小时获取前导 0 并返回 false。

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

有什么想法吗?

评论更新

根据评论,它们是拼写错误,已更正它们并没有产生任何影响。

示例输入文件

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

This is a made up input file

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

{
msg_type[]++
sum[,] += 
summsg[,]++
}
END {
 for (msg in msg_type) {
    print msg
    for (h = 0; h <= 23; h++) {
        if (sum[msg,h] != 0 || summsg[msg,h] != 0)
        printf ("%9.2f\n",sum[msg,h]/summsg[msg,h])
       }
   } 
}

对于您的 MCVE 代码,问题是您在加载数组时使用 0102 对数组进行了索引,但试图使用 1 或 [= 提取数据15=](无前导零)。你必须解决这个问题。例如:

{
  msg_type[]++
  sum[,] += 
  summsg[,]++
  #print "type:", , "hr:", , "value:", 
}
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])
    }
  } 
}

对于示例输入,输出变为:

message1
    10.00
     4.50
message2
     3.00
    11.67

我想你也应该打印小时,但这是你的选择。