grep -c
es útil para encontrar cuántas veces ocurre una cadena en un archivo, pero solo cuenta cada ocurrencia una vez por línea. ¿Cómo contar múltiples ocurrencias por línea?
Estoy buscando algo más elegante que:
perl -e '$_ = <>; print scalar ( () = m/needle/g ), "\n"'
grep
está especificado, pero para cualquiera que lo useack
, la respuesta es sencillaack -ch <pattern>
.Respuestas:
grep
-o
solo dará salida a las coincidencias, ignorando las líneas;wc
puede contarlos:Esto también coincidirá con 'agujas' o 'multineedle'.
Solo palabras sueltas:
fuente
\b
y\B
hace aquí?uniq
solo elimina las líneas idénticas adyacentes, es necesario hacerlosort
antes de alimentaruniq
si no está seguro de que los duplicados siempre serán inmediatamente adyacentes.Si tiene grep de GNU (siempre en Linux y Cygwin, de vez en cuando en otros lugares), puede contar las líneas de salida de
grep -o
:grep -o needle | wc -l
.Con Perl, aquí hay algunas formas en que me parece más elegante que la tuya (incluso después de que se solucione ).
Con solo herramientas POSIX, un enfoque, si es posible, es dividir la entrada en líneas con una sola coincidencia antes de pasarla a grep. Por ejemplo, si está buscando palabras completas, primero convierta cada carácter que no sea una palabra en una nueva línea.
De lo contrario, no hay un comando estándar para realizar este procesamiento de texto en particular, por lo que debe activar sed (si es un masoquista) o awk.
Aquí hay una solución más simple que usa
sed
ygrep
, que funciona para cadenas o incluso expresiones regulares según el libro, pero falla en algunos casos de esquina con patrones anclados (por ejemplo, encuentra dos ocurrencias de^needle
o\bneedle
enneedleneedle
).Tenga en cuenta que en las sustituciones sed anteriores, solía
\n
significar una nueva línea. Esto es estándar en la parte del patrón, pero en el texto de reemplazo, para portabilidad, sustituya la barra diagonal inversa-nueva línea\n
.fuente
Si, como yo, realmente quería
"ambos; cada uno exactamente una vez",(esto es en realidad "cualquiera; dos veces"), entonces es simple:y verifique la salida
2
.El beneficio de este enfoque (si exactamente una vez es lo que desea) es que se escala fácilmente.
fuente
Otra solución usando awk y
needle
como separador de campo:Si desea coincidir
needle
seguido de puntuación, cambie el separador de campo en consecuencia, es decirO use la clase:
[^[:alnum:]]
para abarcar todos los caracteres no alfa.fuente
Su ejemplo solo imprime el número de ocurrencias por línea, y no el total en el archivo. Si eso es lo que quieres, algo como esto podría funcionar:
fuente
Esta es mi solución bash pura
fuente