【发布时间】:2016-06-26 11:04:17
【问题描述】:
问题
所以我有以下代码行:
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 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。
如果需要,我可以提供完整的代码。
有什么想法吗?
评论更新
根据 cmets,它们是拼写错误,已更正,但没有任何影响。
示例输入文件
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
这是一个合成的输入文件
反映输入文件的代码如下:
{
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])
}
}
}
【问题讨论】:
-
你的代码没有使用变量
hr;它使用变量h。然而你的描述使用hr。这是断开连接/打字错误的根源吗?您提到了summsg[$5,%3]++,但其中的%是一个错字。你能提供一个 MCVE (minimal reproducible example) 使用 3 列数据而不是 11 列,并提供示例输入和输出数据吗? -
@JonathanLeffler 我尝试了单独的 if 语句,但我仍然遇到同样的错误。
-
感谢您添加 MCVE 代码。由于这种情况,我没有从代码中得到除以零。请注意,问题可能是作为数组索引的“01”和“1”之间的差异——它们是
awk中的字符串,而不是纯数字。 -
您获取了我发布的代码的访问部分,但没有获取填充部分。再看一遍,当我填充数组时注意
$2+0- stackoverflow.com/a/38020663/1745001。保护自己免受被零除的一般方法是使用像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 并且我无法升级,即使它是一个相当旧的版本”或类似的内容。识别版本好;不过,它不一定需要出现在标题中。