2009-04-02 2 views
4

Ich habe kein Problem den folgenden Befehl von AWK als Stand-alone-Befehl, ohne Fehler:Warum funktioniert mein awk-Einzeiler nicht, wenn ich ihn von Perl aus anrufe?

$ awk '$9 != "NTM" && $9 != ""' myfile.txt | less -Sn 

Aber wenn ich sie in Perl-Skript gelte für qsub Befehl (dh Job in Linux-Cluster ausgeführt wird), dies wie:

use strict; 
use Data::Dumper; 
use Carp; 
use File::Basename; 

my $path = "/mypath/"; 
my @files = glob($path."*.txt"); 

foreach my $file (@files) { 
print "$file\n"; 
    wy $base = basename($file,".fc-gn_".$type); 
    my $nn = $path.$base.".out"; 

print "$file $nn\n"; 

    open PIPE, "| qsub" or die $!; 
    print PIPE <<EOF; 
#!/bin/sh 
#PBS -N CLEAN 
#PBS -l nodes=1:ppn=2 
#PBS -r n 

awk '$9 != "NTM" && $9 !=""' $file > $nn 


EOF 

} 

Es gab den folgenden Fehler

awk: cmd. line:1: != "NTM" && !="" 
awk: cmd. line:1:^syntax error 

Was das Rigg ist ht Weg, es zu tun?

Antwort

14

Setzen Sie ein "\" Zeichen vor all Ihren "$9" Variablen wird es zu beheben. Sie werden von Perl selbst analysiert.

Das folgende Skript:

print <<EOF; 
awk '$9 != "NTM" && $9 !=""' $file > $nn 
EOF 

Ausgänge:

awk ' != "NTM" && !=""' > 

aber:

print <<EOF; 
awk '\$9 != "NTM" && \$9 !=""' \$file > \$nn 
EOF 

Ausgänge:

awk '$9 != "NTM" && $9 !=""' $file > $nn 

Da Sie jedoch $file und $nn wollen von Perl interpretiert werden, sollte die tatsächliche Linie sein:

awk '\$9 != "NTM" && \$9 !=""' $file > $nn 
2

Sie den umgekehrten Schrägstrich-Lösung verwenden können, oder es mehr optisch ansprechend durch die Verwendung:

print <<'EOF'

(und kein Backslash), auch wenn Sie Perl mögen, möchten Sie vielleicht eine Aufnahme bei gearman geben, es ist wirklich cool.

+0

Das Entfernen des Semikolons hat keine Auswirkungen auf das Verhalten in meiner Perl-Version (5.10) - es fügt immer noch Leerzeichen für die $ 9 Variablen ein. Welche Version laufen Sie? – paxdiablo

+0

Tut mir leid, streiche das, ich habe die einfachen Anführungszeichen um das EOF vergessen. Aber jetzt haben Sie ein anderes Problem, die $ Datei und $ nn werden * nicht * von Perl interpretiert, wie sie sein sollten. – paxdiablo

+0

ah richtig, ich habe nicht genau genug geschaut, du musst etwas Backslash machen, wenn du es in einem Block behalten willst – Yann

Verwandte Themen