awk log2除法/零比率
我有一个csv文件,看起来像这样: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
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)致命:除零尝试提醒一下,gawklog()
是自然对数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)。