grep e imprime quantas vezes meu padrão no arquivo 1 está presente no arquivo2

2

Eu tenho um arquivo1 (lista do meu padrão) assim:

arquivo1

Fatty_acid_degradation
Aminobenzoate_degradation
Amino_sugar_and_nucleotide_sugar_metabolism
Amoebiasis

e eu tenho um arquivo2 (lista de todos os padrões).

arquivo2

Fatty_acid_degradation
Fatty_acid_degradation
Fatty_acid_degradation
Bacterial_invasion_of_epithelial_cells
Bacterial_invasion_of_epithelial_cells
Bacterial_invasion_of_epithelial_cells
Bacterial_invasion_of_epithelial_cells

Eu gostaria de grep e contar quantas vezes cada um dos meus padrões no arquivo1 está presente no arquivo2 e obter uma tabela (guia separada) assim:

Fatty_acid_degradation 3
    
por Ilario Ferrocino 04.03.2015 / 15:57

4 respostas

1

A abordagem mais simples seria grep de cada um dos padrões e depois contados:

$ grep -Fwf file1 file2 | sort | uniq -c
      3 Fatty_acid_degradation

As opções grep são -f para fornecer um arquivo como uma lista de padrões para pesquisar, -F para especificar que o padrão deve ser tratado como uma string e não como uma expressão regular e -w para garantir que o padrão é correspondido apenas contra palavras inteiras (para que regulation_of_expression não seja correspondido com upregulation_of_excpression , por exemplo).

Em seguida, você pode usar qualquer ferramenta que preferir para alterar o formato:

$ grep -Fwf file1 file2 | sort | uniq -c | sed -r 's/.*([0-9]+) *(.*)/\t/'
$ grep -Fwf file1 file2 | sort | uniq -c | perl -lane 'print "$F[1]\t$F[0]"'
$ grep -Fwf file1 file2 | sort | uniq -c | awk -vOFS="\t" '{print $2,$1}'

Todos os itens acima retornam

Fatty_acid_degradation  3
    
por 04.03.2015 / 16:13
1
grep -f file1 file2 | sort | uniq -c

Isso fornece a saída no formato:

  3 Fatty_acid_degradation

Você pode viver com isso?

    
por 04.03.2015 / 16:13
0

tantas respostas rápidas, me fazem sentir estranho ...

awk 'FNR == NR { pat[$1]=0 ; next ; }
{ if ( $0 in pat ) pat[$0]++ ; }
END { for ( p in pat ) if ( pat[p]) printf "%s %d\n",p,pat[p] ;}' f1 f2

onde

  • FNR == NR { pat[$1]=0 ; next ; } padrão de registro no array pat
  • { if ( $0 in pat ) pat[$0]++ ; } sempre que um é correspondido, conte
  • END { for ( p in pat ) if ( pat[p]) printf "%s %d\n",p,pat[p] ;} no final, despejar contagem diferente de zero
por 04.03.2015 / 16:21
0

Você também pode tentar a seguinte solução usando o Python:

#!/usr/bin/env python2
import collections
with open('file_1') as f1, open('file_2') as f2:
    counts = collections.Counter(f2)
    for line in f1:
        if line in counts:
            print line.rstrip() + '\t' + str(counts[line])

Aqui usamos a classe Counter do collections module que irá gerar um dicionário contendo as ocorrências de cada elemento de um iterável.

    
por 04.03.2015 / 16:56