Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AWK-if条件是否计算数组输入 问题:_Awk_Gawk - Fatal编程技术网

AWK-if条件是否计算数组输入 问题:

AWK-if条件是否计算数组输入 问题:,awk,gawk,Awk,Gawk,因此,我有以下代码行: if (sum[msg,h]/summsg[msg,h] != 0) printf ("%9.2f\n",sum[msg,h]/summsg[msg,h]) msg是一个包含10个不同值的消息数组 hr保存日志文件中的所有小时数。 sum[]数组将一个字段的值相加(sum[$5,$3]+=$11) 而summsg[]数组正在计算行数(summsg[$5,$3]+) 这是重新调整一个fatal:division by zero未遂错误,但我认为awk将计算sum[msg,

因此,我有以下代码行:

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

这是重新调整一个
fatal:division by zero未遂
错误,但我认为
awk
将计算
sum[msg,h]/sumsg[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

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

有什么想法吗

评论更新 根据评论,他们是打字错误,纠正了他们,他们没有造成任何影响

示例输入文件 这是一个合成的输入文件

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

{
msg_type[$1]++
sum[$1,$2] += $3
summsg[$1,$2]++
}
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])
       }
   } 
}
{
味精类型[$1]++
总和[$1,$2]+=$3
总和[$1,$2]++
}
结束{
用于(msg_类型中的msg){
打印味精

对于(h=0;h对于您的MCVE代码,问题是您在加载数组时使用
01
02
对数组进行了索引,但试图使用
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])
    }
  } 
}

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

你的代码没有使用变量
hr
;它使用变量
h
。但是你的描述使用了
hr
。这是问题的根源吗?你提到
summsg[$5,%3]++
但是里面的
%
是一个打字错误。你能提供一个MCVE()使用3列数据而不是11列数据,并提供示例输入和输出数据?@JonathanLeffler我已经尝试执行单独的if语句,但仍然得到相同的错误。感谢添加MCVE代码。由于这种情况,我没有从代码中得到除零的结果。请注意,问题可能是“01”和“1”“作为数组中的索引-它们是字符串,而不是纯数字,在
awk
中。您使用了我发布的代码的访问部分,而不是填充部分。再次查看,当我填充数组时,请注意
$2+0
。保护自己不被零除的一般方法是使用三元表达式,如
print(denom?num/denom:“NaN”)
或类似。你是指标题中的“AWK 3.1.7”而不是“AWK 1.3.7”吗?你的其他问题似乎是针对3.1.7的。使用GNU AWK 3.1.7来更准确地识别版本是合理的。这是从2009年开始的。你确定不应该升级到3.1.8(从2010年开始),或更可能从2015年起升级到4.1.3?我认为最好从标题中删除该版本,只需添加一段“我正在使用GNU Awk 3.1.7,即使它是一个非常旧的版本,我也无法升级”或类似的内容。识别该版本很好;但它不一定需要出现在标题中。先生,您是一个传奇。
{
  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])
    }
  } 
}
message1
    10.00
     4.50
message2
     3.00
    11.67