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

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

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

Eu tentei:

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

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

Responder1

Se o patternsarquivo contiver apenas strings fixas, em uma gnuconfiguração você poderá 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/\1/\2/|' patterns \
| sed -f - <(grep -of patterns infile)  | sort | uniq -c

isto é, use o mesmo grepcomando, mas desta vez processe o resultado para sedsubstituir as correspondências pelo padrão real (por meio de outro sedscript baseado no conteúdo de patterns)

Responder2

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

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

Tenha em mente, porém, que se você tiver duplicatas em seu arquivoA, a contagem não estará correta, pois será usada várias vezes. Neste caso, execute fileA através do uniq primeiro para remover duplicatas e depois 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

informação relacionada