Подберите самый длинный пептид, используя perl - PullRequest
0 голосов
/ 24 января 2019

Я хочу выяснить максимально длинную последовательность белка, переведенную с компакт-дисков в 6 прямой и обратной рамке.

Это пример входного формата:

>111
KKKKKKKMGFSOXLKPXLLLLLLLLLLLLLLLLLMJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJX
>222
WWWMPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPMPPPPPXKKKKKK

Я хотел бы узнать все строки, которые начинаются с "M" и заканчиваются на "X", подсчитайте каждую длинустроки и выберите самую длинную.

Например, в случае, указанном выше:

, который найдет скрипт,

>111 has two matches:
MGFSOX
MJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJX
>222 has one match:
MPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPMPPPPPX

Затем подсчитайте длину каждого совпадения и напечатайте строкуи количество самых длинных совпадений, что является результатом, который я хочу:

>111
MJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJX    32
>222
MPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPMPPPPPX    38

Но он не выводит ответа.Кто-нибудь знает как это исправить?Любое предложение будет полезно.

#!/usr/bin/perl -w

use strict;
use warnings;

my @pep=();
my $i=();
my @Xnum=();
my $n=();
my %hash=();
my @k=();
my $seq=();
$n=0;
open(IN, "<$ARGV[0]");
while(<IN>){
        chomp;
        if($_=~/^[^\>]/){
                @pep=split(//, $_);
                if($_ =~ /(X)/){
                        push(@Xnum, $1);
                        if($n >= 0 && $n <= $#Xnum){
                                if(@pep eq "M"){
                                        for($i=1; $i<=$#pep; $i++){
                                                $seq=join("",@pep);
                                                $hash{$i}=$seq;
                                                push(@k, $i);
                                        }
                                }
                                elsif(@pep eq "X"){
                                        $n=$n+1;
                                        }
                                foreach (sort {$a cmp $b} @k){
                                        print "$hash{$k[0]}\t$k[0]";
                                }
                        }
                }
        }
        elsif($_=~/^\>/){
                print "$_\n";
        }

}
close IN;

Ответы [ 4 ]

0 голосов
/ 25 января 2019

Вот мое мнение.

Мне нравятся фаст-файлы, заархивированные в хэш, с именем фаста в качестве ключаТаким образом, вы можете просто добавить описание к нему, например, базовый состав и т. Д. *

#!/usr/local/ActivePerl-5.20/bin/env perl 
use strict;
use warnings;
my %prot;

open (my $fh, '<', '/Users/me/Desktop/fun_prot.fa') or die $!;
my $string = do { local $/; <$fh> };
close $fh;
chomp $string;
my @fasta = grep {/./} split (">", $string);
for my $aa (@fasta){
    my ($key, $value) = split ("\n", $aa);
    $value =~ s/[A-Z]*(M.*M)[A-Z]/$1/;
    $prot{$key}->{'len'} = length($value);
    $prot{$key}->{'prot'} = $value;
    }
for my $sequence (sort { $prot{$b}->{'len'} <=> $prot{$a}->{'len'} } keys %prot){
    print ">" . $sequence, "\n", $prot{$sequence}->{'prot'}, "\t", $prot{$sequence}->{'len'}, "\n";
    last;
}     
__DATA__
>1232
ASDFASMJJJJJMFASDFSDAFSDDFSA
>2343
AASFDFASMJJJJJJJJJJJJJJMRGQEGDAGDA

Вывод

>2343
MJJJJJJJJJJJJJJM  16
0 голосов
/ 24 января 2019

Существует более одного способа сделать это!

Попробуйте тоже:

print and next if /^>/;
chomp and my @z = $_ =~ /(M[^X]*X)/g;

my $m = "";
for my $s (@z) {
    $m = $s if length $s > length $m
}
say "$m\t" . length $m

Выход:

>111
MJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJX    32
>222
MPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPMPPPPPX  38

использует> = 5.14 и обязательно запустите скрипт с perl -n


Как однострочник:

perl -E 'print and next if /^>/; chomp and my @z = $_ =~ /(M[^X]*X)/g; my $m = ""; for my $s (@z) { $m = $s if length $s > length $m } say "$m\t" . length $m' -n data.txt
0 голосов
/ 24 января 2019

Вот решение, использующее reduce из List::Util.

Редактировать: ошибочно использованный maxstr, который дал результаты, но не тот, который был необходим.Повторно отредактировал этот пост, чтобы вместо него использовать reduce (правильно).

#!/usr/bin/perl
use strict;
use warnings;
use List::Util qw/reduce/;

open my $fh, '<', \<<EOF;
>111
KKKKKKKMGFSOXLKPXLLLLLLLLLLLLLLLLLMJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJX
>222
WWWMPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPMPPPPPXKKKKKK
EOF

my $id;
while (<$fh>) {
    chomp;
    if (/^>/) {
        $id = $_;   
    }
    else {
        my $data = reduce {length($a) > length($b) ? $a : $b} /M[^X]*X/g;
        print "$id\n$data\t" . length($data) . "\n" if $data;
    }
}
0 голосов
/ 24 января 2019

Проверьте этот Perl однострочник

$ cat iris.txt
>111
KKKKKKKMGFSOXLKPXLLLLLLLLLLLLLLLLLMJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJX
>222
WWWMPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPMPPPPPXKKKKKK

$ perl -ne ' if(!/^>/) { print "$p"; while(/(M[^M]+?X)/g ) { if(length($1)>length($x)) {$x=$1 }  } print "$x ". length($x)."\n";$x="" } else { $p=$_ }  ' iris.txt
>111
MJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJX 32
>222
MPPPPPX 7

$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...