如果总和为零,我怎样才能让 awk 将另一个已知值打印到文件中

如果总和为零,我怎样才能让 awk 将另一个已知值打印到文件中

我有许多文件,在其中提取记录总数和丢失文件总数,以计算数据平均值。我有许多文件,其中丢失的记录数等于记录总数。

这会产生 0 值以及文件数据总和 0 Settotal.tmp,并收到以下错误消息awk: cmd. line:1: (FILENAME=Settotal.tmp FNR=1) fatal: division by zero attempted

不幸的是,这使我的脚本停止了。我已经尝试了多种方法来解决这个问题。我想我可以使用 if 语句来修复,但无法使其工作。

在这种情况下,由于总和为零,我尝试强制该值等于总记录总和:91。在这种情况下,我可以绕过 0 错误并使输出Divsortotal.tmp文件为

{ 有效和缺失(-999)数据的总和(校正值):91 }

输入文件 (Validpoints.tmp):

Sum Total Records: 91
Number of missing data: -91
awk -F ':' '{ sum+=$2 }; END { print "sum of valid and missing(-999) data (corrected value):" sum (if $2=0 {print NF==1 $2})}' Validpoints.tmp > Divsortotal.tmp

任何帮助将不胜感激。谢谢

答案1

我将忽略awk您问题中的代码,因为我不太理解它,而是回答有关如果总和为零则输出另一个值的问题。

要确定总和是否为零,您可以在语句中测试它if

if (sum == 0) { ... }

所以,你会得到

awk -F : '{ sum += $2 } END { if (sum == 0) print "sum = 543"; else printf "sum = %d\n", sum }' file

sum = 543每当总和为零时就会输出,而在所有其他情况下则输出实际总和。

您可以使用单个printf语句稍微压缩它,然后根据 的值选择您使用的值sum

awk -F '{ sum += $2 } END { printf "sum = %d\n", ( sum == 0 ? 543 : sum ) }' file

在这里,( sum == 0 ? 543 : sum )正在使用三元运算符 ?:如果总和为零,则计算为 543;在所有其他情况下,计算为实际总和。

相关内容