当我从Perl调用它时,为什么我的awk单线程工作不起作用?

时间:2009-04-02 01:32:13

标签: linux perl unix awk qsub

使用以下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

这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:14)

在所有"\"变量之前添加"$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

但是,由于您希望Perl解释$file$nn,因此实际行应为:

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

答案 1 :(得分:2)

您可以使用反斜杠解决方案,或使用以下方法使其更具视觉吸引力:

print <<'EOF'

(并且没有反斜杠),如果你喜欢Perl,你可能想要点gearman,这真的很酷。