No perl, a ferramenta para este trabalho é um hash. Um hash é um conjunto de pares de valores-chave que torna esse tipo de referência cruzada bastante fácil.
Observação: isso funcionará SOMENTE se o primeiro campo for único:
#!/usr/bin/env perl
use strict;
use warnings;
my %data;
while (<>) {
my ( $key, $value ) = split;
push( @{ $data{$key} }, $value );
}
foreach my $key ( sort keys %data ) {
if ( @{ $data{$key} } >= @ARGV ) {
print join( "\t", $key, @{ $data{$key} } ), "\n";
}
}
Invoque como myscript.pl file1 file2 file3 file4
.
- lê uma lista se houver arquivos da linha de comando via
<>
e os abre para processamento. - Itera uma linha por vez, dividindo a linha em
$key
e$value
. -
Armazena
$value
em um hash de matrizes. -
é executado em cada chave no seu hash
- se houver elementos numéricos > = número de argumentos da linha de comando (por exemplo, número de arquivos) - imprime essa linha.
Saída disso é:
Bm1_00085|Bm1_22625 0.263974289 0 4 1
Nota:
Assume chaves 'exclusivas' em todos os arquivos.