Как я могу использовать paste и awk внутри Perl? - PullRequest
4 голосов
/ 16 апреля 2009

У меня есть следующий код, который использует «вставить» и сценарий AWK внутри Perl.

use strict;              
use Data::Dumper;        
use Carp;
use File::Basename;      

my @files = glob("result/*-*.txt");
my $tocheck = $ARGV[0] || "M";


foreach my $file ( @files  ) {
    my $base = basename($file,".txt");
    my @res = `paste <\(awk '\$4 == "M" {sum += \$2 }END{print sum}' $file \) <\(awk '\$4 == "M" {sum += \$3 }END{print sum}' $file\)`;
    chomp(@res);         
    print "$base $res[0]\n";     
} 

Почему выдает такую ​​ошибку:

#sh: -c: line 1: syntax error near unexpected token `('
#sh: -c: line 1: `paste <(awk '$4 == "M" {sum += $2 }END{print sum}' result/9547_1-S_aureus.txt ) <(awk '$4 == "M" {sum += $3 }END{print sum}' 
#result/9547_1-S_aureus.txt)

Как правильно это сделать?

Ответы [ 3 ]

11 голосов
/ 16 апреля 2009

Не совсем уверен, что это правильная интерпретация вашего скрипта, так как там, похоже, много мертвого / неиспользуемого кода, но, безусловно, нет необходимости запускать вставку или awk для этого:

#!/usr/bin/perl
use warnings;
use strict;
use File::Basename;

my @files = glob ("result/*-*.txt");

foreach my $file (@files) {
   open (FILE, $file) or die "open $file: $!\n";
   # You seem to be summing the 2nd and 3rd columns if the 4th is "M"
   my ($col1, $col2) = (0, 0);
   while (<FILE>) {
       my @cols = split /\s+/;
       if ($cols[3] eq "M") {
          # Perl uses 0-based arrays, unlike awk
          $col1 += $cols[1];
          $col2 += $cols[2];
       }
   }
   close FILE;
   printf "%s %d\n", basename ($file), $col1;
}
3 голосов
/ 16 апреля 2009

Чтобы устранить ошибку, обратная галочка в Perl явно использует / bin / sh для запуска команды. Ваш / bin / sh не похож на bash и не понимает синтаксис "<(подстановка процесса)". </p>

Я полностью согласен, что вызывать awk из Perl просто глупо.

1 голос
/ 25 февраля 2012

Можно ли упростить следующую команду?

my $inputString = "paste <\(grep \"target:\" $gTestFile | awk '{print \$4,\$5,\$6,\$7,\$8,\$10,\$11,\$12,\$15,\$16,\$17}'\) $preFile";

my @combinedOutput = `$inputString`;
...