我有一个 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
我想计算AVG1
和AVG2
的 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
会一直崩溃。如果您有任何建议如何绕过它,那就太棒了。
答案 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