从包含唯一分子标识符的Fastq文件中删除PCR重复项

2024-06-01 21:56:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编辑一个Fastq文件,其中包含基因组数据和每个序列的独特分子标识符。在

前两次读取的示例如下所示:

1 @HISEQ:230:C6G45ANXX:3:1101:1395:2141 1:N:0:ACAGTGGTTGAACCTT
2 TGACGGCACTTTCTCTTCCCAACCACGTGGCTGCAGACTTCTTGCTCTCAAGTTGTCCTGACATGCTCTGAGAGCACACACAACATACATACAACACCTGGATCTGTGAATTAATTACTGCCTAGG
3 +
4 BB//<<BFBFFF<FFFFBBB<<<F/FBBB<FF/B<FFFFFFFFFFFFFFBFFFBFB/FBFFB//F//B<FFF</</BF<BBBFFFFF//B<FBFF/77F/B/BF7/FF/<BF/7FFFFBBF//B7B
5 @HISEQ:230:C6G45ANXX:3:1101:1498:2162 1:N:0:ACAGTGGTTGAACCTT
6 TGACGGCACTTTCTCTTCCCAACCACGTGGCTGCAGACTTCTTGCTCTCAAGTTGTCCTGACATGCTCTGAGAGCACACACAACATACATACAACACCTGGATCTGTGAATTAATTACTGCCTAGG
7 +
8 BBB<B<F<FFFFFFFBFFFFFFBFFFFBFF/F<FFFFBBFFFFFFFFFFBFB/BFFFFFFFFFFFBFFB/<<<FFFFFFFFFFFFFFBFFFF##################################

这些线路解释如下:

^{pr2}$

我需要一个输出文件,其中给定序列的所有精确重复(及其对应的信息)都已被删除。也就是说,我需要删除那些4行的块,其中第2行已经出现在文件中。在

因此在上面的例子中,由于序列与第2行和第6行相匹配,输出文件应该包含第1、2、3和4行,而不是5、6、7和8行。在

结果输出文件:

1 @HISEQ:230:C6G45ANXX:3:1101:1395:2141 1:N:0:ACAGTGGTTGAACCTT
2 TGACGGCACTTTCTCTTCCCAACCACGTGGCTGCAGACTTCTTGCTCTCAAGTTGTCCTGACATGCTCTGAGAGCACACACAACATACATACAACACCTGGATCTGTGAATTAATTACTGCCTAGG
3 +
4 BB//<<BFBFFF<FFFFBBB<<<F/FBBB<FF/B<FFFFFFFFFFFFFFBFFFBFB/FBFFB//F//B<FFF</</BF<BBBFFFFF//B<FBFF/77F/B/BF7/FF/<BF/7FFFFBBF//B7B

Tags: 文件fff序列ffbbhiseqbftgacggcactttctcttcccaaccacgtggctgcagacttcttgctctcaagttgtcctgacatgctctgagagcacacacaacatacatacaacacctggatctgtgaattaattactgcctagg
2条回答

我想你在FASTQ订单上少了一行。在您的例子中:

1 Junk
2 Junk
3 Junk
4 Information        +->
5 Sequence           |     these four lines constitute a single record
6 +                  |
7 Quality Scoring    +->
9 Information
10 Sequence
11 +

所以第1-3行(垃圾)实际上是前一条记录的前3行,第9-11行是下一条记录的前3行。在

无论如何,我建议您使用BioPython的SeqIO来解析FASTQ文件并消除重复。在

http://biopython.org/wiki/SeqIO

一种基本方法是:

^{pr2}$

这将读取每个记录并计算要存储在列表中的序列的校验和。如果每个后续记录的序列尚未遇到校验和,则只将其添加到输出(“unique”)的列表中。在

这似乎是我们在文件中循环两次的最佳情况:首先计算重复项,然后打印相应的行:

awk 'FNR==NR {
          if (FNR%4==2) {
              a[$2]++
              if (a[$2]>1) b[int(FNR/4)]=1
             }
          next}
      b[int(FNR/4)]==0' file file

这里的关键是使用文件中的4K+2行,并跟踪到目前为止出现了哪些行。如果是这样,我们存储K(来自4K+2),这样在文件的下一个循环中,我们将避免那些行的形式为4K+0/1/2/3。在

为了清楚起见,我假设第一列中的行不在那里(我不知道添加这些行是为了澄清还是真的存在)。移除它们应该很简单。在

测试

^{pr2}$

相关问题 更多 >