2009-04-16 28 views
4

Perl内に 'paste'とAWKスクリプトを使用する次のコードがあります。Perlの中でpasteとawkを使うにはどうすればいいですか?

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) 

それを行うための正しい方法は何ですか?

+2

perl 1.0はAWKの*置換*と見なされます。将来のためにそれを念頭に置いてください。 –

答えて

11

が死んだ/未使用コードの多くがあるように見えますが、これを行うには産卵ペーストや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

エラーを解決するために、Perlのバックティックは/ bin/shを明示的に使用してコマンドを実行します。あなたの/ bin/shはbashに似ておらず、 "<(プロセス置換)"の構文を理解していません。

私はPerlからのawkの呼び出しがちょうど愚かであることに完全に同意します。

1

次のコマンドを簡略化できますか?

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

my @combinedOutput = `$inputString`; 
関連する問題