¿Por qué no mi awk trabajo de una sola línea hace cuando lo llamo de Perl?
Pregunta
No tengo ningún problema con el siguiente comando de AWK como un solo comando de soporte, sin ningún error:
$ awk '$9 != "NTM" && $9 != ""' myfile.txt | less -Sn
Pero cuando les aplico el interior guión de Perl para qsub (es decir, en ejecución comando de empleo en cluster Linux), así:
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
}
Se dio el siguiente error
awk: cmd. line:1: != "NTM" && !=""
awk: cmd. line:1: ^ syntax error
¿Cuál es la forma correcta de hacerlo?
Solución
Poner un carácter "\"
antes de que todas las variables "$9"
lo arreglará. Están siendo analizados por sí mismo Perl.
La siguiente secuencia de comandos:
print <<EOF;
awk '$9 != "NTM" && $9 !=""' $file > $nn
EOF
salidas:
awk ' != "NTM" && !=""' >
pero:
print <<EOF;
awk '\$9 != "NTM" && \$9 !=""' \$file > \$nn
EOF
salidas:
awk '$9 != "NTM" && $9 !=""' $file > $nn
Sin embargo, ya que desea $file
y $nn
a ser interpretado por Perl, la línea real debe ser:
awk '\$9 != "NTM" && \$9 !=""' $file > $nn
Otros consejos
puede utilizar la solución barra invertida, o hacerla más atractiva visualmente mediante el uso de:
print <<'EOF'
(y sin barra invertida), también si te gusta Perl, es posible que desee dar un tiro en gearman , que es realmente genial.