awk log2除法/零比率

awk log2除法/零比率,awk,divide-by-zero,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

我有一个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        
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
我想计算
AVG1
AVG2
log2比率,并将其打印到每行的AVG列旁边,使其如下所示:

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        
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
就会不断崩溃。如果你有任何关于如何绕过它的建议,那就太好了。

你的问题是,你应该单独打印标题行

要验证它,请执行以下操作:

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{…}
fix的输出:

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

您的问题是,您应该单独打印标题行

要验证它,请执行以下操作:

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{…}
fix的输出:

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

你的第二个例子对我很有用。你得到了什么“崩溃”信息?嗨,我得到了致命错误:awk:cmd。第1行:(FILENAME=testlog2.csv FNR=1)致命:除零尝试提醒一下,gawk
log()
是自然对数
ln
。谢谢你让我知道。我已经看过如何将ln转换成log2,这个公式有效吗:log2(n)=ln(n)/ln(2)=log(n)/log(2)?在使用
log
编程时,这是一个常见的技巧。您的第二个示例对我来说效果很好。你得到了什么“崩溃”信息?嗨,我得到了致命错误:awk:cmd。第1行:(FILENAME=testlog2.csv FNR=1)致命:除零尝试提醒一下,gawk
log()
是自然对数
ln
。谢谢你让我知道。我已经看过如何将ln转换成log2,这个公式有效吗:log2(n)=ln(n)/ln(2)=log(n)/log(2)?这是使用
log
编程时的常见技巧,谢谢!这太棒了。我正在检查公式。
($3/$4)/log(2)
是错误的,因为这只是比率的重新缩放:你可能指的是比率的二进制对数的
log($3/$4)/log(2)
。例如,在
AVG1
等于0.10和
AVG2
等于0.16的第一行中,比率小于1,因此其日志必须为负(并且应计算为-0.687097)。谢谢!这太棒了。我正在检查公式。
($3/$4)/log(2)
是错误的,因为这只是比率的重新缩放:你可能指的是比率的二进制对数的
log($3/$4)/log(2)
。例如,在
AVG1
等于0.10且
AVG2
等于0.16的第一行中,比率小于1,其对数必须为负(应计算为-0.687097)。