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        

とのlog2比率を計算し、各行の AVG 列の横に出力して、次のようにします。AVG1AVG2

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

しかしawk、分母が0の場合は常にクラッシュし続けます。それを回避する方法について何か提案があれば、それは素晴らしいでしょう.

4

1 に答える 1

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
于 2013-04-23T09:21:01.463 に答える