Regex 将awk脚本转换为perl

Regex 将awk脚本转换为perl,regex,perl,awk,Regex,Perl,Awk,我正试图将这段代码翻译成perl gawk '/^>c/ {OUT=substr($0,2) ".fa";print " ">OUT}; OUT{print >OUT}' your_input 有人能帮我吗?Perl有一个实用程序可以帮你完成这个任务。如果您的脚本是callscript.awk,则您将运行: $ a2p script.awk 产生: #!/usr/bin/perl eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'

我正试图将这段代码翻译成perl

 gawk '/^>c/ {OUT=substr($0,2) ".fa";print " ">OUT}; OUT{print >OUT}' your_input

有人能帮我吗?

Perl有一个实用程序可以帮你完成这个任务。如果您的脚本是call
script.awk
,则您将运行:

$ a2p script.awk
产生:

#!/usr/bin/perl
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
    if $running_under_some_shell;
            # this emulates #! processing on NIH machines.
            # (remove #! line above if indigestible)

eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;
            # process any FOO=bar switches

$, = ' ';       # set output field separator
$\ = "\n";      # set output record separator

while (<>) {
    chomp;  # strip record separator
    if (/^>c/) {
    $OUT = substr($_, (2)-1) . '.fa';
    &Pick('>', $OUT) &&
        (print $fh ' ');
    }
    ;

    if ($OUT) {
    &Pick('>', $OUT) &&
        (print $fh $_);
    }
}

sub Pick {
    local($mode,$name,$pipe) = @_;
    $fh = $name;
    open($name,$mode.$name.$pipe) unless $openammeamme}++;
}

Perl还提供了一个转换sed脚本的工具:。

Perl有一个实用程序可以为您完成这项工作。如果您的脚本是call
script.awk
,则您将运行:

$ a2p script.awk
产生:

#!/usr/bin/perl
eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
    if $running_under_some_shell;
            # this emulates #! processing on NIH machines.
            # (remove #! line above if indigestible)

eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;
            # process any FOO=bar switches

$, = ' ';       # set output field separator
$\ = "\n";      # set output record separator

while (<>) {
    chomp;  # strip record separator
    if (/^>c/) {
    $OUT = substr($_, (2)-1) . '.fa';
    &Pick('>', $OUT) &&
        (print $fh ' ');
    }
    ;

    if ($OUT) {
    &Pick('>', $OUT) &&
        (print $fh $_);
    }
}

sub Pick {
    local($mode,$name,$pipe) = @_;
    $fh = $name;
    open($name,$mode.$name.$pipe) unless $openammeamme}++;
}

Perl还提供了一个转换sed脚本的工具:。

此Perl one liner应该与该awk命令等效:

perl -ane 'if($F[0] =~ /^>c/){$OUT=substr($F[0],1).".fa"; if(OUT==null) {open(OUT,">$OUT");} print OUT " \n"} if ($OUT){print OUT $_} END{close(OUT)}' file
缩进命令行:

perl -ane 'if ($F[0] =~ /^>c/) {
       $OUT = substr($F[0], 1).".fa"; 
       if (OUT==null) { open(OUT, ">$OUT") }
       print OUT " \n"
    }
    if ($OUT) {
       print OUT $_
    }
    END{close(OUT)
}' file

此perl one liner应与该awk命令等效:

perl -ane 'if($F[0] =~ /^>c/){$OUT=substr($F[0],1).".fa"; if(OUT==null) {open(OUT,">$OUT");} print OUT " \n"} if ($OUT){print OUT $_} END{close(OUT)}' file
缩进命令行:

perl -ane 'if ($F[0] =~ /^>c/) {
       $OUT = substr($F[0], 1).".fa"; 
       if (OUT==null) { open(OUT, ">$OUT") }
       print OUT " \n"
    }
    if ($OUT) {
       print OUT $_
    }
    END{close(OUT)
}' file
创建2个文件:

==> caaa.fa <==
>caaa
sdf
sdff
==> cbbb.fa <==
>cbbb
ew
ew
==>caaa.fa caaa
自卫队
sdff
==>cbbb.fa cbbb
电子战
电子战
创建2个文件:

==> caaa.fa <==
>caaa
sdf
sdff
==> cbbb.fa <==
>cbbb
ew
ew
==>caaa.fa caaa
自卫队
sdff
==>cbbb.fa cbbb
电子战
电子战

我刚刚使用了它,我运行了script.pl,但它给了我这个消息。我相信
a2p
会产生正确的翻译,但只要你不必查看源代码,它就很好。脚本将fasta文件拆分为其他较小的文件,awk文件可以工作,但perl文件不能:s(几年前)我开始学习perl,用awk编写脚本,并将它们转换为perl,并简化结果!:)我刚刚使用了它,运行了script.pl,但它给了我这个消息。我相信
a2p
会产生正确的翻译,但只要你不必查看源代码,它就很好。脚本将fasta文件拆分为其他较小的文件,awk文件可以工作,但perl文件不能:s(几年前)我开始学习perl,用awk编写脚本,并将它们转换为perl,并简化结果!:)是否可以将其用作perl脚本中的函数?对不起,我真的不擅长这一点:(我相信你也可以在perl脚本中使用它。对不起,我不是perl专家,只是想使用等效的一行逻辑将awk转换为perl。啊,这是正确的,谢谢你指出。awk索引从perl的0开始,而不是从1开始。很抱歉,我坚持:
length($F[0]-1)
对于典型的
长度(“>cfile”-1)
长度(0-1)
=
长度(-1)
=2。以前的方法对于小文件ID(我们在测试中使用的ID):“>ca”!。您的新命名解决方案更简单、正确。“缩进命令行”“这是一个好主意!@JJoao:感谢您查看此内容和您的有用评论。是否可以将其用作perl脚本中的函数?抱歉,我在这方面做得很差:(我相信您也可以在perl脚本中使用它。很抱歉,我不是perl专家,只是想使用等效的一行逻辑将awk转换为perl。啊,这是正确的,谢谢您指出。awk索引从perl的0开始,而不是从1开始。很抱歉坚持:
length($F[0]-1)
对于典型的
长度(“>cfile”-1)
is
length(0-1)
=
length(-1)
=2。之前的方法对于小文件ID(我们在测试中使用的ID:)>ca”!效果很好。您的新命名解决方案更简单、更正确。“缩进命令行”是个好主意!@JJoao:感谢您对此进行研究并提供有用的意见。