
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 patterns
arquivo contiver apenas strings fixas, em uma gnu
configuraçã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 grep
comando, mas desta vez processe o resultado para sed
substituir as correspondências pelo padrão real (por meio de outro sed
script 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