AWK-if和printf,在之前或之内

AWK-if和printf,在之前或之内,awk,gawk,Awk,Gawk,我有以下printf printf ("%-6s\t%6.3f\n",msg,sum[msg]/count[msg]) 此操作的数组如下所示: sum[$2] += $3 count[$2]++ $2=test1 $3=0-9随机在不同的行上 我要做一个if语句,表示如果sum[msg]或count[msg]==0,则替换为- 我不确定是否必须执行以下操作: if (count[msg] == 0 || sum[msg] == 0) { printf ("%-6s\t-\n",msg) }

我有以下
printf

printf ("%-6s\t%6.3f\n",msg,sum[msg]/count[msg])
此操作的数组如下所示:

sum[$2] += $3
count[$2]++
$2=test1
$3=0-9
随机在不同的行上

我要做一个if语句,表示如果
sum[msg]
count[msg]
==0,则替换为
-

我不确定是否必须执行以下操作:

if (count[msg] == 0 || sum[msg] == 0) {
printf ("%-6s\t-\n",msg)
}
printf ("%-6s\t%6.3f\n",msg,if (count[msg] == 0 || sum[msg] == 0) {print -} else sum[msg]/count[msg])
或者是否可以将if放入
printf
中,如下所示:

if (count[msg] == 0 || sum[msg] == 0) {
printf ("%-6s\t-\n",msg)
}
printf ("%-6s\t%6.3f\n",msg,if (count[msg] == 0 || sum[msg] == 0) {print -} else sum[msg]/count[msg])
另外,如果实际的
总和[$2]+=$3
没有匹配的行,则返回
0
null

非常感谢您的帮助

printf "%-6s\t%s\n",msg,(sum[msg]*count[msg]?sprintf("%6.3f",sum[msg]/count[msg]):"-")

请阅读Arnold Robbins的有效AWK程序,第四版,以获得一个基础,这样你就不必在每一步都要寻求帮助。

我已经告诉过你在以前的问题中该怎么做。见下面我的评论。考虑到每隔几个小时就发布一个问题,你似乎很少努力自己解决问题,甚至试图理解别人给你的解决方案,而是在每次遇到你可能需要思考几秒钟的问题时立即发布一个新问题。请阅读Arnold Robbins的《有效的Awk编程》第四版。@EdMorton恕我直言,我在一个问题上花了好几个小时,并且不断地引用/检查。我承认我对
awk
比较陌生,我不完全了解所有事情的来龙去脉,但关于你的评论“我已经告诉过你……”,我认为你没有。在我发布一个问题之前,我会回顾一下我之前发布的所有问题,我尝试做的不是像stackoverflow.com/q/38023336/1745001的决议那样处理“前导0”。请再次查看。我提供的解决方案是在填充数组时按
+0
处理前导零,正如我在下面的注释中提醒您的那样,这样您就不必问这个问题,并且在这些注释中我告诉您“防止被零除的一般方法是使用三元表达式,如
print(denom?num/denom:“NaN”)
或类似问题。”这是您现在提出的特定问题的解决方案。读这本书是为了得到一个基础,你不会花太多的时间去问/问。我承认我确实忽略了中的
+0
,但我不完全理解您使用的三元表达式。请你把
print
语句打成
if
,因为我的速记很糟糕吗?
if(denom)print num/denom;否则请打印“NaN”
。请参阅。我是否可以确认
sum[msg]*count[msg]
只是检查它是否为
0