从fastq文件

时间:2016-06-02 07:33:05

标签: bash bioinformatics fastq

我有一个关于从采样的对端fastq文件中随机选择读取的问题。我读了一些关于这种方式的主题,但没有一个可以解决我的问题,这是: 我有两个fastq文件R1.fastq和R2.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

我对R2_sample.fastq做了同样的事情。然后我合并了两个已排序的文件,以便R1在一列中,R2在第二列中:

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

现在我想从每对中随机选择一个读数。我最初的想法是使用shuf从1-2范围获得一个随机数:

shuf -i1-2 -n1

然后以某种方式选择读取的对应于我从shuf获得的数字。例如,在第一次迭代中,我得到1,所以我从第1列中选择读取,在socond迭代中我得到2,所以从下一对读取中我选择第二列中的读取等。

我被困在这里。所以我的问题是,有一个简洁的方法来做到这一点?也许用awk或其他方法?任何帮助将非常感激。

对Ashafixs的评论回答:
感谢您的回复,并对此抱歉抱歉...... 我已经测试了你的解决方案,他们似乎都有缺陷 对于第一个脚本,我构建了测试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

您可以看到输出不正确。第二次读取缺少三行,总共应该有六次读取而不是三次。此外,每次运行脚本时,它都会输出不同数量的读数。

对于第二个脚本,我输入了如上所述的合并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  

但是这次我总是得到五次读数。仍然缺少一个。第二个和第三个读取头是相同的。这不应该发生。

1 个答案:

答案 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