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:
-
-n
invocaráPerl
ler arquivo linha por linha E nenhuma impressão, a menos que seja solicitada. -
-l
faráRS = ORS = \n
-
Estruturas de dados envolvidas:
- hash
%h
terá chaves como genes lidos emfile1
. - array
@h
terá genes (não-dup) na ordem em que foram encontrados durante a leitura defile1
. - hash
%s
deve ter chaves com genes e valores como o número de vezes que esse gene foi visto emfile2
.
- hash
-
Trabalhando:
-
@ARGV
deve 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 afile
e preencherá o hash%h
e a matriz@h
. - A segunda linha será aplicada às linhas lidas de
file2
e atualizará o hash%s
para 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
%s
será impresso com base na ordem das chaves definidas pelo array@h
.
-