как я могу передать значение через командную строку - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть данные, сохраненные в .txt, как показано ниже:

>sp|Q96A73|P33MX_HUMAN Putative monooxygenase p33MONOX OS=Homo sapiens OX=9606 GN=KIAA1191 PE=1 SV=1
RNDDDDTSVCLGTRQCSWFAGCTNRTWNSSAVPLIGLPNTQDYKWVDRNSGLTWSGNDTCLYSCQNQTKGLLYQLFRNLFCSYGLTEAHGKWRCADASITNDKGHDGHRTPTWWLTGSNLTLSVNNSGLFFLCGNGVYKGFPPKWSGRCGLGYLVPSLTRYLTLNASQITNLRSFIHKVTPHR
>sp|P13674|P4HA1_HUMAN Prolyl 4-hydroxylase subunit alpha-1 OS=Homo sapiens OX=9606 GN=P4HA1 PE=1 SV=2
VECCPNCRGTGMQIRIHQIGPGMVQQIQSVCMECQGHGERISPKDRCKSCNGRKIVREKKILEVHIDKGMKDGQKITFHGEGDQEPGLEPGDIIIVLDQKDHAVFTRRGEDLFMCMDIQLVEALCGFQKPISTLDNRTIVITSHPGQIVKHGDIKCVLNEGMPIYRRPYEKGRLIIEFKVNFPENGFLSPDKLSLLEKLLPERKEVEE
>sp|Q7Z4N8|P4HA3_HUMAN Prolyl 4-hydroxylase subunit alpha-3 OS=Homo sapiens OX=9606 GN=P4HA3 PE=1 SV=1
MTEQMTLRGTLKGHNGWVTQIATTPQFPDMILSASRDKTIIMWKLTRDETNYGIPQRALRGHSHFVSDVVISSDGQFALSGSWDGTLRLWDLTTGTTTRRFVGHTKDVLSVAFSSDNRQIVSGSRDKTIKLWNTLGVCKYTVQDESHSEWVSCVRFSPNSSNPIIVSCGWDKLVKVWNLANCKLK
>sp|P04637|P53_HUMAN Cellular tumor antigen p53 OS=Homo sapiens OX=9606 GN=TP53 PE=1 SV=4
IQVVSRCRLRHTEVLPAEEENDSLGADGTHGAGAMESAAGVLIKLFCVHTKALQDVQIRFQPQL
>sp|P10144|GRAB_HUMAN Granzyme B OS=Homo sapiens OX=9606 GN=GZMB PE=1 SV=2
MQPILLLLAFLLLPRADAGEIIGGHEAKPHSRPYMAYLMIWDQKSLKRCGGFLIRDDFVLTAAHCWGSSINVTLGAHNIKEQEPTQQFIPVKRPIPHPAYNPKNFSNDIMLLQLERKAKRTRAVQPLRLPSNKAQVKPGQTCSVAGWGQTAPLGKHSHTLQEVKMTVQEDRKCES
>sp|Q9UHX1|PUF60_HUMAN Poly(U)-binding-splicing factor PUF60 OS=Homo sapiens OX=9606 GN=PUF60 PE=1 SV=1
MGKDYYQTLGLARGASDEEIKRAYRRQALRYHPDKNKEPGAEEKFKEIAEAYDVLSDPRKREIFDRYGEEGLKGSGPSGGSGGGANGTSFSYTFHGDPHAMFAEFFGGRNPFDTFFGQRNGEEGMDIDDPFSGFPMGMGGFTNVNFGRSRSAQEPARKKQDPPVTHDLRVSLEEIYSGCTKKMKISHK
>sp|Q06416|P5F1B_HUMAN Putative POU domain, class 5, transcription factor 1B OS=Homo sapiens OX=9606 GN=POU5F1B PE=5 SV=2
IVVKGHSTCLSEGALSPDGTVLATASHDGYVKFWQIYIEGQDEPRCLHEWKPHDGRPLSCLLFCDNHKKQDPDVPFWRFLITGADQNRELKMWCTVSWTCLQTIRFSPDIFSSVSVPPSLKVCLDLSAEYLILSDVQRKVLYVMELLQNQEEGHACFSSISEFLLTHPVLSFGIQVVSRCRLRHTEVLPAEEENDSLGADGTHGAGAMESAAGVLIKLFCVHTKALQDVQIRFQPQLNPDVVAPLPTHTAHEDFTFGESRPELGSEGLGSAAHGSQPDLRRIVELPAPADFLSLSSETKPKLMTPDAFMTPSASLQQITASPSSSSSGSSSSSSSSSSSLTAVSAMSSTSAVDPSLTRPPEELTLSPKLQLDGSLTMSSSGSLQASPRGLLPGLLPAPADKLTPKGPGQVPTATSALSLELQEVEP
>sp|O14683|P5I11_HUMAN Tumor protein p53-inducible protein 11 OS=Homo sapiens OX=9606 GN=TP53I11 PE=1 SV=2
MIHNYMEHLERTKLHQLSGSDQLESTAHSRIRKERPISLGIFPLPAGDGLLTPDAQKGGETPGSEQWKFQELSQPRSHTSLKVSNSPEPQKAVEQEDELSDVSQGGSKATTPASTANSDVATIPTDTPLKEENEGFVKVTDAPNKSEISKHIEVQVAQETRNVSTGSAENEEKSEVQAIIESTPELDMDKDLSGYKGSSTPTKGIENKAFDRNTESLFEELSSAGSGLIGDVDEGADLLGMGREVENLILENTQLLETKNALNIVKNDLIAKVDELTCEKDVLQGELEAVKQAKLKLEEKNRELEEELRKARAEAEDARQKAKDDDDSDIPTAQRKRFTRVEMARVLMERNQYKERLMELQEAVRWTEMIRASRENPAMQEKKRSSIWQFFSRLFSSSSNTTKKPEPPVNLKYNAPTSHVTPSVK

Я пытаюсь разбить каждый раздел на максимально возможное количество 10 областей.

например строкикоторый начинается с> остаются прежними.это выглядит примерно так:

>sp|Q96A73|P33MX_HUMAN Putative monooxygenase p33MONOX OS=Homo sapiens OX=9606 GN=KIAA1191 PE=1 SV=1
RNDDDDTSVC
NDDDDTSVCL
DDDDTSVCLG
DDDTSVCLGT
.
.
.
.

Так что я могу легко разделить данные, например, на 10 секций, используя следующее.Однако я не хочу устанавливать количество букв, которые я хочу разделить внутри алгоритма.Я хочу иметь возможность выбирать любой номер, который я хочу.Я пытаюсь использовать Getopt :: Std Может кто-нибудь помочь мне найти способ сделать это?

Например, я хочу запустить код, подобный этому

perlscript.pl data.txt 10

use warnings;
use strict;
use Getopt::Std

unless (defined $DESIRED_LENGTH and $DESIRED_LENGTH =~ /^[0-9]+$/) {
my $DESIRED_LENGTH ;
while (<>) {
    chomp; # remove trailing newline
    if (m/^>/) {          # if line starts with '>'
        print "$_\n";     # just print it
    } else {
        my $i = 0;
        while ($i + $DESIRED_LENGTH <= length($_)) {
            print substr($_, $i, $DESIRED_LENGTH);
            print "\n";
            $i++;
        }
    }
}
}

Или я тоже попробовал это

use warnings;
use strict;
use Getopt::Std

getopts('i');
our($opt_i)
my $DESIRED_LENGTH = $opt_i;
while (<>) {
    chomp; # remove trailing newline
    if (m/^>/) {          # if line starts with '>'
        print "$_\n";     # just print it
    } else {
        my $i = 0;
        while ($i + $DESIRED_LENGTH <= length($_)) {
            print substr($_, $i, $DESIRED_LENGTH);
            print "\n";
            $i++;
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 06 апреля 2019
  • Вам не хватает пары точек с запятой.
  • Вы не гарантировали, что -i был указан, или не указали значение по умолчанию, когда его не было.
  • Вы не сказали getopts, что параметр -i ожидал параметр.
  • Вы не проверили предоставленную длину.
  • Вы увеличивали $i на 1вместо того, сколько вы уже напечатали.
  • Вы обрезали конец каждой последовательности, если они не оказались точным кратным указанной длины.Это может привести к потере целых последовательностей, если они будут достаточно короткими.
  • -i - странный выбор для длины , но, возможно, вы пытаетесь быть совместимым с другим инструментом?
  • Вы чинили строки, начинающиеся с ^, только чтобы добавить перевод строки назад.

Исправлено:

use warnings;
use strict;
use feature qw( say );

use Getopt::Std;

our $opt_i;
getopts('i:');
die("Illegal value for -i\n") if defined($opt_i) && $opt_i !~ /^[1-9][0-9]*\z/;

my $max_len = $opt_i // 70;

while (<>) {
    if (/^>/) {
        print;
    } else {
        chomp;
        while (length($_)) {
           say substr($_, 0, $max_len, "");
        }
    }
}

Конечно, еслипоследовательности в файле ранее были перенесены на длину строки меньше указанной длины, указанная выше программа не расширяет их до желаемой длины.

use warnings;
use strict;
use feature qw( say );

use Getopt::Std;

our $opt_i;
getopts('i:');
die("Illegal value for -i\n") if defined($opt_i) && $opt_i !~ /^[1-9][0-9]*\z/;

my $desired_len = $opt_i // 70;

my $seq;
while (1) {
   my $line = <>;
   if (!defined($line) || $line =~ /^>/) {
      while (length($seq)) {
         say substr($seq, 0, $desired_len, "");
      }

      last if !defined($line);

      print($line);
      $seq = "";
   } else {
      chomp($line);
      $seq .= $line;
   }
}
0 голосов
/ 13 апреля 2019

если ваши данные в файле 'd';

perl -ne 'if(/^>s.+\n/) {chomp; $_.="\n".<>; /^(>s.+\n)(\w+\n)/; print "\n$1"; print substr $2,$_ for 0..9}' d
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...