awk log2 division / ratio zero

时间:2013-04-23 09:05:57

标签: awk divide-by-zero

我有一个 csv 文件,如下所示:

ID1              ID2         AVG1     AVG2         
ENSG00000207447 RNU6-2    0.101431  0.163308     
ENSG00000207427 SNORA51   0.096551  0            
ENSG00000201784 SNORD14A  0.068653  0.0320985    
ENSG00000207315 SNORA28   0         0.01936      
ENSG00000207787 MIR98     0         0        

我想计算AVG1AVG2 log2 比率,并将其打印在每行的AVG列旁边,以便它看起来像这样:

ID1              ID2       AVG1         AVG2       log2Ratio
ENSG00000207447 RNU6-2    0.101431  0.163308     2.0632577007
ENSG00000207427 SNORA51   0.096551  0            inf
ENSG00000201784 SNORD14A  0.068653  0.0320985    7.105015172
ENSG00000207315 SNORA28   0         0.01936      0
ENSG00000207787 MIR98     0         0            inf

我试过

$ awk 'NF> 2 { ratio =($3/$4)/log(2) ; print $0, ratio }' testlog2.csv > testlog2_2.csv
and
$ awk 'BEGIN{OFS="\t"} {if ($4==0) {print $0, "inf"} else {print $0, ($3/$4)/log(2)}}' testlog2.csv > testlog2_2.csv

但是当分母为0时,awk会一直崩溃。如果您有任何建议如何绕过它,那就太棒了。

1 个答案:

答案 0 :(得分:3)

您的问题是,您应该单独打印头条。

验证它:

kent$  awk 'BEGIN{print "A"/"B"}'                                                                                                                                           
awk: cmd. line:1: fatal: division by zero attempted

您可以将awk行更改为:

 awk 'BEGIN{OFS="\t"} NR==1{print;next}{if ($4==0) {print $0, "inf"} else {print $0, ($3/$4)/log(2)}}' file

我的代码没有太大变化,基本上是复制和粘贴,只需添加NR==1部分。

注意

如果您运行代码,您将看到输出与您的预期不同(示例中的示例)。我希望你的逻辑($3/$4)/log(2)是正确的。

NR==1{...}修正的输出:

ID1              ID2       AVG1      AVG2
ENSG00000207447  RNU6-2    0.101431  0.163308   0.896061
ENSG00000207427  SNORA51   0.096551  0          inf
ENSG00000201784  SNORD14A  0.068653  0.0320985  3.08567
ENSG00000207315  SNORA28   0         0.01936    0
ENSG00000207787  MIR98     0         0          inf