按 DNA 长度对 multiFASTA 文件进行排序

问题描述 投票:0回答:3

我正在尝试按长度对 multiFASTA 文件进行排序。我已经弄清楚了字母排序,但我似乎无法得到数字排序。输出应该是排序的 multiFASTA 文件。这是另一个程序的一个选项。这是代码。

sub sort {
my $length;
my $key;
my $id;
my %seqs;
my $seq;
my $action = shift;
my $match = $opts{$action};
$match =~ /[l|id]/ || die "not the right parameters\n";
my $in = Bio::SeqIO->new(-file=>"$filename", -format=>'fasta');
    while(my $seqobj = $in->next_seq()){
        my $id = $seqobj->display_id();
        my $length=$seqobj->length();
        #$seq =~s/.{1,60}\K/\n/sg;
        $seqs{$id} = $seqobj, unless $match eq 'l';
        $seqs{$length}=$seqobj, unless $match eq 'id';
    }
    if($match eq 'id'){
        foreach my $id (sort keys %seqs) {
             printf ">%-9s \n%-s\n", $id, $seqs{$id}->seq;
        }
    }
    elsif($match eq 'l'){
        foreach my $length ( sort keys %seqs){
             printf "%-10s\n%-s\n",$length, $seqs{$length}->seq;
        }
    }
}
sorting perl bioinformatics bioperl
3个回答
0
投票

要按数字排序,您必须提供比较子例程:

sort { $a <=> $b } keys %seqs

你确定没有两个序列可以具有相同的长度吗?

$seqs{$length}=$seqobj
覆盖之前存储的值。


0
投票

单行:使用 awk 来线性化。第二个 awk 添加包含长度的列,在此列上排序,删除该列,恢复 fasta 序列。

awk '/^>/ {printf("%s%s\t",(N>0?"\n":""),$0);N++;next;} {printf("%s",$0);} END {printf("\n");}'  input.fa  |\
awk -F '\t' '{printf("%d\t%s\n",length($2),$0);}' |\
sort -t $'\t' -k1,1n |\
cut -f 2- |\
tr "\t" "\n"

PS:对于生物信息学问题,您应该使用https://www.biostars.org/,或https://bioinformatics.stackexchange.com/等...


0
投票

您可以使用 pyfaidx 或查看 jim hester repos。但正如 @pierre 上面所说,你应该问有关 Biostars 的问题。关于Biostars的答案可以在这里找到。

© www.soinside.com 2019 - 2024. All rights reserved.