データ平均を計算するために、レコードの総数と欠落ファイルの総数を抽出するファイルがたくさんあります。不足しているレコードの数がレコードの総数と同じファイルがたくさんあります。
これにより、0という値が生成され、ファイルデータの合計は0にSettotal.tmp
なり、次のエラーメッセージが表示されますawk: cmd. line:1: (FILENAME=Settotal.tmp FNR=1) fatal: division by zero attempted
。
残念ながら、これは私のスクリプトを中断します。この問題を解決するためにいくつかの方法を試しました。私はifステートメントを使って問題を解決できると思いましたが、うまくいきませんでした。
この場合、合計はゼロなので、強制的にレコード全体の合計である91に等しくなるように値を設定しようとしています。この場合、ゼロエラーをバイパスし、出力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 )
ここでは三項演算子 ?:
合計が 0 の場合、計算は 543 であり、他のすべてのケースでは実際の合計です。