2016-06-02 14 views
1

サンプリングされたペアエンドfastqファイルからのランダムな選択に関する質問があります。私はこの方法に関するいくつかの話題を読んだが、誰も私の問題を解決することができなかった: 私は2つのfastqファイルR1.fastqとR2.fastqを得た。私が達成したいのは、これらのファイルを無作為にサンプリングすることです。サンプリングされた各ペアから、ランダムに1つの読み取りのみを選択します。私は今のところです...fastqファイルの読み込みペアからのランダム読み出しの選択

私はseqtkを使用して、私のファイルをサンプリングしたのは何

seqtk sample -s100 R1.fastq 10000 > R1_sample.fastq 
seqtk sample -s100 R2.fastq 10000 > R2_sample.fastq 

は、私はこのようなシーケンスIDにより、各ファイルのソート順:

paste - - - - < R1_sample.fastq | sort -k1 -t " " | tr "\t" "\n" > R1_sample_sorted.fastq 

をI R2_sample.fastqと同じことをしました。

pr -mts R1_sample_sorted.fastq R2_sample_sorted.fastq > merged.fastq 

ファイルは次のようになります:

@D3YGT8Q1:297:C7T4RACXX:3:1101:1000 @D3YGT8Q1:297:C7T4RACXX:3:1101:1000 
TGATGTTTGGATGTAAAGTGAAATATTAGTTGGCG AGCTTTCCTCACTATCTGCTTCATCCGCCAACTAA 
+     + 
BBBFFFFFFFFFFFIFFIFFIIIIFIIIFIIFIII B0<FFFFFFFFFFIIIIIIIIIIIIIIIIIIIIII 
@D3YGT8Q1:297:C7T4RACXX:3:1101:1000 @D3YGT8Q1:297:C7T4RACXX:3:1101:1000 
CCTCCTAGGCGACCCAGACAATTATACCCTAGCCA TGTTTAAGGGGTTGGCTAGGGTATAATTGTCTGGG 
+     + 
BBBFFFFFFFFFFIIIIIIIIIIIIIIIIIIIIII BBBFFFFFFFFFFIIIIIIIIBFFIIIIIIIIIII 
@D3YGT8Q1:297:C7T4RACXX:3:1101:1000 @D3YGT8Q1:297:C7T4RACXX:3:1101:1000 
TTCTATTTATTACCTCAGAAGTTTTTTTCTTCGCA GTAAAAGGCTCAGAAAAATCCTGCGAAGAAAAAAA 
+     + 
BBBFFFFFFFFFFIIIIIIIIFIIFIIIFIIIIII BBBFFFFFFFFFFIIIIIIIIIIIIIIIIIIIIII 

そして今、私がランダムに1つだけ選択しますそれから私は、R1は2列目の1列R2になるようにソートされたファイルの両方を吸収合併しました各対から読み取る。

shuf -i1-2 -n1 

、その後どういうわけか、私はSHUFからもらった番号にcooresponding読み込みを選択します。私の最初のアイデアは、範囲1-2から乱数を取得するためにSHUFを使用することでした。たとえば、最初の反復では1が得られたので、列1から読み込みを選択します。ソコード反復では、2番目の読み込みで2を取得します。2番目の列などで読み込みを選択します。

。だから私の質問は、これを行うためのきちんとした方法がありますか?たぶんawkや他の方法で?どんな助けも非常に高く評価されます。 Ashafixsの答えに

コメント:あなたの応答のための
おかげで、巨大な遅延のため申し訳ありません...! 私はあなたのソリューションをテストしましたが、両方とも欠陥があるようです。
最初のスクリプトでは、test fastqファイルR1とR2に6つの読み込みが含まれていました。スクリプトを実行した後、正しい順番(ID、seq、desc、qual)で6つの読み込み(24行)を出力するが、R1またはR2ファイルからランダムに選択された読み込みのセットとして出力することを期待する。私がスクリプトから得たものは次のとおりです。

@D3YGT8Q1:297:C7T4RACXX:3:1101:10002:27381 2:N:0:ATGCTCGTTCTCTCGT 
AGCTTTCCTCACTATCTGCTTCATCCGCCAACTAATATTTCACTTTACATCCAAACATCAAGATC 
+ 
B0<FFFFFFFFFFIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIFIFIFIIIIIIIIII 
@D3YGT8Q1:297:C7T4RACXX:3:1101:10004:50631 2:N:0:ATGCTCGTTCTCTCGT 
@D3YGT8Q1:297:C7T4RACXX:3:1101:10007:32152 1:N:0:ATGCTCGTTCTCTCGT 
GTAAGGTTAGGAGGGTGTTAATTATTAAAATTAAGGCGAAGTTTATTACTCTTTTTTGAATGTTG 
+ 
BBBFFFFFFFFFFIIBFFIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIFFFFFFFF 

出力が正しくないことがわかります。 2回目の読み取りには3行がありません.3回ではなく6回の読み取りが必要です。さらに、スクリプトを実行するたびに、異なる数の読み込みが出力されます。

2番目のスクリプトでは、上記のようにマージされたfastqファイルを入力します。出力は最初のスクリプトの出力と似ています:

@D3YGT8Q1:297:C7T4RACXX:3:1101:10002:27381 2:N:0:ATGCTCGTTCTCTCGT 
AGCTTTCCTCACTATCTGCTTCATCCGCCAACTAATATTTCACTTTACATCCAAACATCAAGATC 
+ 
B0<FFFFFFFFFFIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIFIFIFIIIIIIIIII 
@D3YGT8Q1:297:C7T4RACXX:3:1101:10004:50631 2:N:0:ATGCTCGTTCTCTCGT 
@D3YGT8Q1:297:C7T4RACXX:3:1101:10004:50631 2:N:0:ATGCTCGTTCTCTCGT 
TGTTTAAGGGGTTGGCTAGGGTATAATTGTCTGGGTCGCCTAGGAGGAGATCGGAAGAGCGTCGT 
+ 
BBBFFFFFFFFFFIIIIIIIIBFFIIIIIIIIIIIFFFIIIIIIFIIIIIFIIIFFFFFFFFFFF 
@D3YGT8Q1:297:C7T4RACXX:3:1101:10004:88140 1:N:0:ATGCTCGTTCTCTCGT 
ACTGTAACTTAAAAATGATCAAATTATGTTTCCCATGCATCAGGTGCAATGAGAAGCTCTTCATC 
+ 
BBBFFFFFFFFFFIIIIIIIIIIFIIIIIIFIIIIIIIIIIIIIFIIIIIIIIIIIIIIIIIIII 
@D3YGT8Q1:297:C7T4RACXX:3:1101:10007:32152 2:N:0:ATGCTCGTTCTCTCGT 
CTAGTTTTGACAACATTCAAAAAAGAGTAATAAACTTCGCCTTAATTTTAATAATTAACACCCTC 
+ 
BBBFFFFFFFFFFIIIIIIIIIIIIIIFFFIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIFIII 

しかし、私はいつも5つの読みを取得します。それでもなお欠けている。また、2番目と3番目の読み取りヘッダーは同じです。これは起こらないはずです。

+0

スクリプトで問題が解決しましたか? –

答えて

0

次のスクリプトを試すこともできます(ライナーとしても機能します)。まず最初のfastqファイルからすべてのヘッダーを取得した後、fastqファイルをランダムに選択し、そこから4行を返します。 注:これは、両方のファイルが同じ位置に同じヘッダーを持つ場合にのみ機能します。

#!/bin/bash 
headers=$(grep @ R1_sample.fastq) 
var=1 
for line in $headers ; do 
    r=$(shuf -i1-2 -n1) 
    tail -n +$var "R$r"_sample.fastq | grep -m 1 -A 4 $line 
    var=$((var+4)) 
done 

また、あなたのマージを拡張し、列のアプローチを選ぶことができます。 cutは、マージされた出力からランダムな列を削除するために使用されます。

#!/bin/bash 
headers=$(grep @ merged.fastq) 
var=1 

for line in $headers ; do 
    r=$(shuf -i1-2 -n1) 
    tail -n +$var merged.fastq | grep -m 1 -A 4 $line | cut -d$'\t' -f$r 
    var=$((var+4)) 
done 
関連する問題