我如何通过命令行传递值

时间:2019-04-05 23:58:09

标签: perl

我有一个保存在.txt中的数据,如下所示

.includes

我正在尝试将每个部分尽可能地分成10个区域。

例如,以>开头的行保持不变。变成这样

.has

因此,我可以轻松地将数据拆分为多个我想使用以下10部分。但是,我不想设置要在算法内拆分的字母数。我希望能够选择我想要的任何号码。我正在尝试使用 Getopt :: Std ?有人可以帮我找到一种方法吗?

例如,我要运行这样的代码

perl script.pl data.txt 10

.includes

或者我也尝试过

>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

2 个答案:

答案 0 :(得分:2)

  • 您缺少几个分号。
  • 您不确定要提供-i还是要提供未提供的默认值。
  • 您没有告诉getopts -i选项需要一个参数。
  • 您未验证提供的长度。
  • 您将$i增加了1,而不是您已经打印了多少。
  • 您要截断每个序列的末尾,除非它们恰好是指定长度的精确倍数。如果序列太短,可能会导致整个序列丢失。
  • -i length 的怪异选择,但也许您正试图与其他工具保持一致?
  • 您正在斩断以^开头的行,只是为了向后添加换行符。

已修复:

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;
   }
}

答案 1 :(得分:0)

如果您的数据在“ d”文件中;

perl -ne 'if(/^>s.+\n/) {chomp; $_.="\n".<>; /^(>s.+\n)(\w+\n)/; print "\n$1"; print substr $2,$_ for 0..9}' d