¿Cómo usar grep con patrones en un archivo y obtener el número de apariciones de cada patrón?

¿Cómo usar grep con patrones en un archivo y obtener el número de apariciones de cada patrón?

Estoy tratando de descubrir cómo usar grep con los patrones en fileA.txt y buscarlos en fileB.tab. El resultado que quiero es el número de apariciones de cada patrón en fileB.tab.

Yo he tratado:

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

Pero creo que eso me está devolviendo todas las líneas en FileB.tab donde aparece un patrón fileA.tab.

Respuesta1

Si el patternsarchivo contiene solo cadenas fijas, en una gnuconfiguración podría hacer

grep -oFf patterns infile | sort | uniq -c

Si el contenido es una expresión regular, entonces tal vez 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

es decir, use el mismo grepcomando solo que esta vez procese el resultado para sedreemplazar las coincidencias con el patrón real (a través de otro sedscript basado en el contenido de patterns)

Respuesta2

Uniq tiene una opción para contar las ocurrencias.

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

Sin embargo, tenga en cuenta que si tiene duplicados en su archivo A, el recuento no será correcto, ya que los buscará varias veces. En este caso, primero ejecute fileA a través de uniq para eliminar duplicados y luego utilícelo para los patrones.

Puede filtrarlo en un archivo nuevo o procesar el archivo línea por línea y ejecutarlo.

while read keyword; do grep $keyword fileB.txt; done < fileA.txt | uniq -c

información relacionada