Para esta entrada dada:
How to get This line that this word repeated 3 times in THIS line?
But not this line which is THIS word repeated 2 times.
And I will get This line with this here and This one
A test line with four this and This another THIS and last this
Quiero esta salida:
How to get This line that this word repeated 3 times in THIS line?
And I will get This line with this here and This one
Obtener líneas enteras contiene solo tres palabras repetidas "esto". (coincidencia entre mayúsculas y minúsculas)
text-processing
αғsнιη
fuente
fuente
$RANDOM_LANGUAGE
: alguien podrá encontrar una solución.Respuestas:
En
perl
, reemplacethis
con mayúsculas y minúsculas y cuente el número de reemplazos:Usando un recuento de coincidencias en su lugar:
Si tienes GNU awk, una forma muy simple:
El número de campos será uno más que el número de separadores.
fuente
Asumiendo que su archivo fuente es tmp.txt,
El grep izquierdo genera todas las líneas que no tienen 4 o más ocurrencias de "this" que distinguen entre mayúsculas y minúsculas en tmp.txt.
El resultado se canaliza al grep derecho, que genera todas las líneas con 3 o más ocurrencias en el resultado grep izquierdo.
Actualización: Gracias a @Muru, aquí está la mejor versión de esta solución,
reemplace 4 con n + 1 y 3 con n.
fuente
grep
necesita terminar*
.this
.grep -iv '.*this.*this.*this.*this.*' tmp.txt | grep -i '.*this.*this.*this.* |grep -iv '.*this.*this.'
grep -Eiv '(.*this){4,}' | grep -Ei '(.*this){3}'
esto podría hacerlo práctico para N = 50.En python, esto haría el trabajo:
salidas:
O para leer desde un archivo, con el archivo como argumento:
Pegue el script en un archivo vacío, guárdelo como
find_3.py
, ejecútelo con el comando:Por supuesto, la palabra "this" se puede reemplazar por cualquier otra palabra (u otra cadena o sección de línea), y el número de ocurrencias por línea se puede establecer en cualquier otro valor en la línea:
Editar
Si el archivo fuera grande (cientos de miles / millones de líneas), el siguiente código sería más rápido; lee el archivo por línea en lugar de cargar el archivo a la vez:
fuente
Puedes jugar un poco con
awk
esto:Esto devuelve:
Explicación
Lo que hacemos es definir el separador de campo para
this
sí mismo. De esta forma, la línea tendrá tantos campos +1 como vecesthis
aparezca la palabra .Para hacerlo insensible a mayúsculas y minúsculas, utilizamos
IGNORECASE = 1
. Ver referencia: Sensibilidad a mayúsculas y minúsculas en el emparejamiento .Entonces, es solo una cuestión de decir
NF==4
que todas esas líneas tenganthis
exactamente tres veces. No se necesita más código, ya{print $0}
que (es decir, imprimir la línea actual) es el comportamiento predeterminado deawk
cuando una expresión se evalúaTrue
.fuente
Suponiendo que las líneas se almacenan en un archivo llamado
FILE
:fuente
sed ...
comando y agregar la-o
opción para en sugrep -oi ...
lugar.$(grep -ic "this" <<<"$line")
-c
opción contará el número de líneas que coinciden con "este", no el número de "este" palabras en cada línea.-l
y-w
sería equivalente en este caso?Si estás en Vim:
Esto solo imprimirá líneas coincidentes.
fuente
Solución Ruby de una sola línea:
Funciona de una manera bastante simple: redirigimos el archivo al stdin de ruby, ruby obtiene la línea del stdin, lo limpia con
chomp
ydowncase
, yscan().count
nos da varias ocurrencias de una subcadena.fuente