
さまざまなサンプルの遺伝子の数を示すマトリックスがあります
Col1: GeneName
Col2: Length
Col3;Col4;Col5; Counts for genes in sampleA/sampleB/sampleC
Col6;Col7;Col8; Total counts in sampleA/sampleB/sampleC
これはマトリックスの例です。
A1BG 1758 53 4373 207 46005749 43849471 31554941
A1BG-AS1 2126 5 88 12 46005749 43849471 31554941
A1CF 9695 8882 3522 437 46005749 43849471 31554941
A2M 5399 15963 12325 7227 46005749 43849471 31554941
A2M-AS1 6660 50 33 36 46005749 43849471 31554941
counts_sampleA / (total_counts_sampleA*Length) を他のサンプルについても同様に割り算したい
cat inFile | awk 'BEGIN {OFS="\t"} { print $1,$2,$3/($6*$2),$4/($7*$2),$5/($8*$2) }'
これは予想通りの結果だ
A1BG 1758 6.55307e-10 5.67278e-08 3.73151e-09
A1BG-AS1 2126 5.11204e-11 9.43963e-10 1.78875e-10
A1CF 9695 1.99136e-08 8.28471e-09 1.42845e-09
A2M 5399 6.42672e-08 5.20606e-08 4.24207e-08
A2M-AS1 6660 1.63186e-10 1.12999e-10 1.71301e-10
問題なく動作しますが、マトリックスが大きい場合は適していません。サンプルが 100 個あり、column3-column102 に geneCountinEachSample が含まれ、Coulmn103-column202 に totalCountinEachSample が含まれる場合は、どのように記述すればよいでしょうか。
for ループで使用したいのですが、サンプルがさらに多い場合は、任意の数の列で動作しますか?
cat inFile | awk 'BEGIN {OFS="\t"} { row=NF; samples=3; size=$samples+2; for ( i=3; i<=$size; i++); END print $i/$[$i+$samples] }'
これを機能させる方法について何か提案があれば教えてください。 ありがとうございます!
答え1
さて、あなたはほぼ答えを得ました:
awk '
{cols=((NF/2) + 1)
for (i=1; i <= cols; i++) {
if (i >= 3) {
count_index= i + cols - 2
printf("%s\t", 1.0 * $i / ($count_index * $2))
} else {
printf("%s\t", $i)
}
}
printf("\n")
}' inFile
を使用するのは最適ではないことに注意してくださいcat file | awk ...
。awkはファイルを直接引数として扱います。それでも、を使用する方がawk ... < infile
猫の無駄な使い方。
答え2
perl -F'\s+' -lane '$,="\t"; # OFS made a TAB
my($gN, $gL) = splice @F, 0, 2; # store gene name & length
print $gN, $gL, map { sprintf "%.5e", $F[$_] / ( $F[$_+@F/2] * $gL ) } 0 .. @F/2-1;
' gene_samples.file
FS
1 つ以上の空白に設定されます。ORS = RS = \n
@F
特定のレコードのフィールドを保持します。splice
オフセット 0 から始まる 2 つの要素を分割し、配列のサイズも削減します。- OP 仕様によると、@F に残っているのは偶数要素です。前半は counts_for_each_sample で、後半は total_count_for_each_sample です。
結果
A1BG 1758 6.55307e-10 5.67278e-08 3.73151e-09
A1BG-AS1 2126 5.11204e-11 9.43963e-10 1.78875e-10
A1CF 9695 1.99136e-08 8.28471e-09 1.42845e-09
A2M 5399 6.42672e-08 5.20606e-08 4.24207e-08
A2M-AS1 6660 1.63186e-10 1.12999e-10 1.71301e-10