لماذا لا تعمل سطرتي الفردية عندما أسميها من لغة Perl؟

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

  •  22-08-2019
  •  | 
  •  

سؤال

ليس لدي مشكلة في استخدام الأمر التالي لـ AWK كأمر قائمة بذاتها ، دون أي خطأ:

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

ولكن عندما أقوم بتطبيقها داخل البرنامج النصي لـ Perl لـ com.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" الخاص بك وسوف إصلاحه. كنت يجري تحليل من قبل بيرل نفسها.

والسيناريو التالي:

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 ليتم تفسيره من قبل بيرل، يجب أن يكون الخط الفعلي:

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

نصائح أخرى

يمكنك استخدام حل الشرطة المائلة العكسية، أو جعله أكثر جاذبية من خلال استخدام:

print <<'EOF'

(ولا يوجد شرطة مائلة عكسية)، وأيضًا إذا كنت تحب لغة Perl، فقد ترغب في تجربتها gearman, ، انه حقا رائع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top