排序fastq文件并保持序列长度为15-17 bp

时间:2015-07-31 22:26:22

标签: bioinformatics fastq

我有一些非常大的fastq文件,我使用cutadapt修剪转座子末端序列,这应该导致剩下15-17个碱基对的基因组DNA。使用cutadapt后,很大一部分fastq文件是15-17个碱基对,但是一些序列相当长(表明它们没有转座子末端序列,它们对我的实验来说是垃圾读取)。

我的问题:是否有我可以在Linux中使用的命令或脚本,以便我对这些fastq文件进行排序并输出一个新的fastq,其中只包含15-17个碱基对的读取,同时仍保留通常的fastq格式?

作为参考,fastq格式如下所示:

@D64TDFP1:287:C69APACXX:2:1101:1319:2224 1:N:0:
GTTAGACCGGATCCTAACAGGTTGGATGATAAGTCCCCGGTCTAT
+
DDHHHDHHGIHIIIIE?FFHECGHICHHGH>BD?GHIIIIFHIDG
@D64TDFP1:287:C69APACXX:2:1101:1761:2218 1:N:0:
GTTAGACCGGATCCTAACAGGTTGGATGATAAGTCCCCGGTCTAT
+
FFHHHHHJIJJJJJIIJJJIJHIJJGIJIIIFJ?HHJJJJGHIGI

我发现了一个类似的问题here,但似乎找不到正确的解决方案。有没有人有任何解决方案?

1 个答案:

答案 0 :(得分:0)

一次读取四行数组。当读取长度介于阈值之间时,打印出这四行。

以下是如何使用Perl执行此操作的示例,但原理在Python或任何其他脚本语言中都是相同的:

var someObject = {
    functions: {
        "a": function () { return 0; },
        "b": function () { return 1; }
    },
    get: ( function ( someVariable ) {
        var func;
        Object.keys( this.functions ).forEach( ( function ( functionKey ) {
            if ( someVariable.startsWith( functionKey ) ) {
                console.log( typeof this.functions[ functionKey ] );
                func = this.functions[ functionKey];
            }
        } ).bind( this ) );
        return func;
    } ),
    check: function ( stringToCheck ) {
        var returnedFunction = this.get( stringToCheck );
        console.log( typeof returnedFunction );
        return !!returnedFunction;
    }
}

使用,例如:

#!/usr/bin/env perl

use strict;
use warnings;

my $fastq;
my $lineIdx = 0;
while (<>) {
    chomp;
    $fastq->[$lineIdx++] = $_;
    if ($lineIdx == 4) {
        my $readLength = length $fastq->[1];
        if (($readLength >= 15) && ($readLength <= 17)) {
            print "$fastq->[0]\n$fastq->[1]\n$fastq->[2]\n$fastq->[3]\n";
        }
        $lineIdx = 0;
    }
}

按照找到的顺序打印出读数。这只是过滤,应该非常快。否则,如果您需要对某些条件进行排序,请在您的问题中指定排序条件。