Aqui está um script perl que faz o trabalho. Ele lê stdin e extrai os nomes dos arquivos para usar como chave para um array com hash chamado %wavfiles
. A estrutura de dados particular usada é um hash-de-arrays, um array com hash onde cada elemento é uma lista (ou seja, um array) contendo um ou mais valores.
Quando houver uma linha correspondente à regex /Interpretation Score/
AND se $filename
não estiver vazia, ela usará split()
para extrair a pontuação de interpretação e enviá-la para a matriz contida em $wavfiles{$filename}
. Em seguida, ele limpa $filename
para evitar que dados espúrios sejam adicionados a essa chave.
Quando não há mais entrada a ser lida, ela imprime o conteúdo dos hash-of-arrays %wavfiles
no formato CSV.
Este script funcionará com qualquer número de arquivos de entrada, de qualquer tamanho. Ele trata todos os nomes de arquivos especificados na linha de comando e / ou todos os dados enviados de stdin como um fluxo de entrada.
A ordem da entrada é significativa - ela afeta diretamente a ordem dos Interpretation Scores na saída (por exemplo, se vê 567 antes de 55, que é a ordem em que exibirá esses valores. e vice-versa).
O script não está limitado a apenas dois Interpretation Scores para cada nome de arquivo - ele imprimirá quantos ver para cada nome de arquivo, separados por vírgulas na ordem em que foram vistos.
#! /usr/bin/perl
use strict;
my %wavfiles = ();
my $filename = '';
while(<>) {
chomp; # strip line-feed from end of line
$filename = $_ if (m/\.wav$/);
if ((m/Interpretation Score/) && (! -z $filename)) {
my (undef,$score) = split /: /; # split input line on ': '
push @{ $wavfiles{$filename} }, $score;
$filename = '';
};
}
foreach $filename (keys %wavfiles) {
print "$filename,", join(",",@{ $wavfiles{$filename} }),"\n";
}
A saída usando sua entrada de amostra é:
$ ./interpscore.pl file1 file2
message_bbb.wav,972,34
Message_ccc.wav,921
message_aaa.wav,567,55
message_ccc.wav,12
Observe que as chaves hash, como os nomes de arquivos, fazem distinção entre maiúsculas e minúsculas, e é por isso que existe uma entrada para Message_ccc.wav
(com maiúscula M) e message_ccc.wav
(com minúscula m). em seus arquivos de entrada. Você precisa editar seus arquivos de entrada para que os nomes dos arquivos fiquem consistentes - depois disso, a saída será:
$ ./interpscore.pl file1 file2
message_aaa.wav,567,55
message_ccc.wav,921,12
message_bbb.wav,972,34