Почему мой однострочник awk не работает, когда я вызываю его из Perl?

StackOverflow https://stackoverflow.com/questions/707981

  •  22-08-2019
  •  | 
  •  

Вопрос

У меня нет проблем с использованием следующей команды 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, возможно, вы захотите попробовать редукторщик, это действительно круто.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top