Почему мой однострочник awk не работает, когда я вызываю его из Perl?
Вопрос
У меня нет проблем с использованием следующей команды AWK в качестве отдельной команды, без каких-либо ошибок:
$ awk '$9 != "NTM" && $9 != ""' myfile.txt | less -Sn
Но когда я применяю их внутри скрипта Perl для qsub (т.е.запуск задания в кластере Linux) команда, подобная этой:
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
}
Это выдало следующую ошибку
awk: cmd. line:1: != "NTM" && !=""
awk: cmd. line:1: ^ syntax error
Как правильно это сделать?
Решение
Помещая "\"
характер перед всеми вашими "$9"
переменные исправят это.Они анализируются самим Perl.
Следующий скрипт:
print <<EOF;
awk '$9 != "NTM" && $9 !=""' $file > $nn
EOF
результаты:
awk ' != "NTM" && !=""' >
но:
print <<EOF;
awk '\$9 != "NTM" && \$9 !=""' \$file > \$nn
EOF
результаты:
awk '$9 != "NTM" && $9 !=""' $file > $nn
Однако, поскольку вы хотите $file
и $nn
чтобы быть интерпретируемой Perl, фактическая строка должна быть:
awk '\$9 != "NTM" && \$9 !=""' $file > $nn
Другие советы
вы можете использовать решение с обратной косой чертой или сделать его более визуально привлекательным с помощью:
print <<'EOF'
(и без обратной косой черты), также, если вам нравится Perl, возможно, вы захотите попробовать редукторщик, это действительно круто.