translating awk script into perl

I'm trying to translate this code into perl.

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

Can someone help me?

Upvotes: 0

Views: 272

Answers (3)

anubhava
anubhava

Reputation: 784918

This perl one liner should be equivalent of that awk command:

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

Indented command line:

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

Upvotes: 1

JJoao
JJoao

Reputation: 5347

#!/usr/bin/perl

my ($outf,$OUT) ;
while(<>){
  if(/^>(c.*)/){ $OUT = "$1.fa";
                 close($outf) if $outf;
                 open($outf,">",$OUT);
                 print OUT " \n"}
  if($outf){ print $outf $_ }
}

if input is:

>caaa
sdf
sdff
>cbbb
ew
ew

Creats 2 files:

==> caaa.fa <==
>caaa
sdf
sdff
==> cbbb.fa <==
>cbbb
ew
ew

Upvotes: 2

Chris Seymour
Chris Seymour

Reputation: 85765

Perl has a utility to do this for you called a2p. If your script is call script.awk then you would run:

$ a2p script.awk

Which produces:

#!/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}++;
}

To save this to a file, use redirection:

$ a2p script.awk > script.pl

Perl also provides a tool for converting sed scripts: s2p.

Upvotes: 2

Related Questions