Mantenga únicamente las líneas que contengan x o menos números. archivo TXT

Mantenga únicamente las líneas que contengan x o menos números. archivo TXT

Encontré una pregunta similar:

Pero en este caso no quiero comprobar la longitud total, sino el número de dígitos de la línea. Por ejemplo, de esta entrada:

cdc85e24-b9e9-8802-080a-b84479e1ae82  
ekodeveloper0  
1795475824.1129747.1472396049615.ref  
1795475824.1129747.1472396049615  
967175540.1194446.1472407271491  
wangxiuyan552  
jveazey  
xoloki  
whelee  
matthauck  
patel3.anirudh  
mischa.salle  

¿Cómo puedo eliminar todas las líneas con más de N dígitos?

Respuesta1

Dado que etiquetó su pregunta perl, una forma de hacerlo en Perl sería aprovechar el hecho de que Perl trdevuelve un recuento del número de caracteres reemplazados; así que por ejemplo (tomando N = 13) podrías hacer

perl -ne 'print unless tr/[0-9]/[0-9]/ > 13' file
ekodeveloper0
wangxiuyan552
jveazey
xoloki
whelee
matthauck
patel3.anirudh
mischa.salle

Una forma posiblemente más convencional sería evaluar la coincidencia de expresiones regulares en un contexto escalar para obtener un recuento.

perl -ne '$c = () = /\d/g; print unless $c > 13' file

ver por ejemplo¿Existe un atajo de Perl para contar el número de coincidencias en una cadena?

Respuesta2

Es más fácil mantener solo las líneas que tienen X omásnúmeros. Aquí hay un ejemplo de eso donde X es 13:

sed -n 's/[0-9]/&/13p' input.txt > output.txt

Sin embargo, puede modificar esto para hacer lo contrario. Aquí hay un comando que solo mantendrá las líneas que tenganmenos de 13números:

sed -n -e 's/[0-9]/&/13;t' -e 'p' input.txt > output.txt

Explicación: imprima solo líneas con más de 13 números

sed -n 's/[0-9]/&/13p' input.txt > output.txt

El &símbolo en el texto de reemplazo significa "todo lo que coincidió".

El indicador numérico en el scomando (después de la /find/replace/parte) significa que solo se reemplaza esa instancia del patrón de búsqueda.

La pbandera en el scomando significa "imprimir si se realizó una sustitución".

El -ncambio, por supuesto, es suprimir la acción de "imprimir" predeterminada de Sed.

Explicación: imprima solo líneas con <13 números

sed -n -e 's/[0-9]/&/13;t' -e 'p' input.txt > output.txt

El -ecambio es "ejecutar"; simplemente pasa un comando. Lo necesitamos aquí ya que estamos pasando por más de uno.

El tcomando omite los comandos restantes si el último scomando realizó una sustitución.

El pcomando se imprime.

información relacionada