Comment puis-je utiliser pâte et awk dans Perl?

J’ai le code suivant qui utilise ‘pâte’ et le script AWK dans Perl.

use ssortingct; 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"; } 

Pourquoi il donne une telle erreur:

 #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) 

Quelle est la bonne façon de le faire?

Pas tout à fait sûr s’il s’agit d’une interprétation correcte de votre script, car il semble y avoir beaucoup de code mort / inutilisé, mais il n’y a certainement pas besoin d’aller chercher du pâte ou de créer un awk pour cela:

 #!/usr/bin/perl use warnings; use ssortingct; 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 () { 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; } 

Pour corriger l’erreur, le backtick de Perl utilise explicitement / bin / sh pour exécuter la commande. Votre / bin / sh n’est pas comme bash et ne comprend pas la syntaxe “<(substitution de processus)".

Je suis tout à fait d’accord pour dire qu’appeler awk de Perl est tout simplement idiot.

La commande suivante peut-elle être simplifiée?

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