
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 patterns
archivo contiene solo cadenas fijas, en una gnu
configuració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 grep
comando solo que esta vez procese el resultado para sed
reemplazar las coincidencias con el patrón real (a través de otro sed
script 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