行列計算とゼロ除算の防止

行列計算とゼロ除算の防止

データテーブルの値の平均を計算したいです。

データ行列の例

S1  1   3   4   5   16  3   3   4   6   0
S2  1   6   4   5   16  3   4   6   6   0
S3  1   3   4   3   4   7   3   5   16  9
S4  0   0   4   5   6   0   0   4   5   6

アイデアはcol7col2で分けるcol8ことですcol3col11col11

期待される出力

S1  0.75    0.5 0.5 0.545455    0
S2  0.75    0.4 0.6 0.545455    0
S3  0.875   0.5 0.555556    0.842105    0.692308
S4  0  0  0.5  0.5  0.5

awkスクリプト

cat TestFile  | awk '{ out=$1; for(i=2;i<=6;i++) out=out"\t"$(i+5)/($i+$(i+5)); print out }'

コマンド出力

S1  0.75    0.5 0.5 0.545455    0
S2  0.75    0.4 0.6 0.545455    0
S3  0.875   0.5 0.555556    0.842105    0.692308
awk: cmd. line:1: (FILENAME=- FNR=4) fatal: division by zero attempted

「0」で割るとエラーになります。

0で割ったときにエラーを報告せずに「0」を埋める方法。

答え1

 awk '{for (i=2;i<=6;i++) $i = ($(i+5)!=0? $(i+5)/($i+$(i+5)): 0); NF=6} 1' file

私たちは条件式、除算する前に除数をテストし、ゼロの場合は除算せずに値を割り当て、エラーを発生させます。また、最初の6つの列のみを印刷しても、NF=6レコードを割り当てて印刷するだけで十分です。


Tab意図した出力をソートするには、出力フィールド区切り記号定義を使用するか、スペースを埋めたタブの形awk -v OFS='\t'に出力をパイプします。colun -t

S1  0.75   0.5  0.5       0.545455  0
S2  0.75   0.4  0.6       0.545455  0
S3  0.875  0.5  0.555556  0.842105  0.692308
S4  0      0    0.5       0.5       0.5

関連情報