データテーブルの値の平均を計算したいです。
データ行列の例
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
アイデアはcol7
、col2
で分けるcol8
ことですcol3
。col11
col11
期待される出力
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