Como usar o grep com padrões em um arquivo e obter o número de ocorrências de cada padrão?

3

Eu estou tentando descobrir como usar o grep com os padrões em fileA.txt e procurá-los em fileB.tab. O resultado que quero é o número de ocorrências de cada padrão em fileB.tab.

Eu tentei:

grep -f FileA.txt FileB.tab | wc -l

Mas eu acho que isso está me devolvendo todas as linhas no FileB.tab onde um padrão fileA.tab aparece.

    
por Néstor 06.04.2017 / 14:04

2 respostas

1

Se o arquivo patterns contiver somente cadeias fixas, em uma configuração gnu você poderia fazer

grep -oFf patterns infile | sort | uniq -c

Se o conteúdo for regex, talvez algo como

sed -E 'h;s|/|\&|g;x;s|[\&/]|\&|g;H;x;s|(.*)\n(.*)|s///|' patterns \
| sed -f - <(grep -of patterns infile)  | sort | uniq -c

que usa o mesmo comando grep , só que desta vez processe o resultado com sed para substituir as correspondências com o padrão real (via outro script sed baseado no conteúdo de patterns )

    
por 06.04.2017 / 14:41
0

o uniq tem uma opção para contar as ocorrências

grep -f fileA.txt fileB.txt | uniq -c

Tenha em mente que, se você tiver duplicatas no seu arquivo A, a contagem não estará correta, pois será usada várias vezes para eles. Neste caso, execute o fileA através do uniq primeiro para remover as duplicatas e use-o para os padrões.

Você pode filtrá-lo em um novo arquivo ou processar o arquivo linha por linha e executá-lo.

while read keyword; do grep $keyword fileB.txt; done < fileA.txt | uniq -c
    
por 06.04.2017 / 14:40

Tags