矩阵计算并避免被零除

矩阵计算并避免被零除

我想计算数据表中值的平均值

数据矩阵示例

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, col2bycol8等等col3,直到col11bycol11

预期产出

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

相关内容