perl -lne '
$h{"$_"}=$h[@h]=$_,next if @ARGV && !exists $h{$_};
for my $h (@h) { 1+index(s/\h+/ /rg, " $h chromosome ") && $s{$h}++; }
}{print "$_ $s{$_}" for @h;
' file1 file2
Saída:
Equus caballus 10
Monodelphis domestica 5
Saccharomyces cerevisiae S288c 1
Explicação:
-
-ninvocaráPerller arquivo linha por linha E nenhuma impressão, a menos que seja solicitada. -
-lfaráRS = ORS = \n -
Estruturas de dados envolvidas:
- hash
%hterá chaves como genes lidos emfile1. - array
@hterá genes (não-dup) na ordem em que foram encontrados durante a leitura defile1. - hash
%sdeve ter chaves com genes e valores como o número de vezes que esse gene foi visto emfile2.
- hash
-
Trabalhando:
-
@ARGVdeve ter conteúdo de 1 arquivo ao ler o primeiro argumento (arquivo1) e vazio ao ler o segundo argumento (arquivo2). Portanto, a primeira linha será aplicada somente afilee preencherá o hash%he a matriz@h. - A segunda linha será aplicada às linhas lidas de
file2e atualizará o hash%spara o número de vezes que um determinado gene foi encontrado em uma determinada linha.-
index(str, substr)function retornará a posição da substring na string se encontrada, otw a -1 será retornada na falha.
-
- A terceira linha será executada após o arquivo2 ter sido lido e o conteúdo do hash
%sserá impresso com base na ordem das chaves definidas pelo array@h.
-