problemas con grep -v

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )

Moderadores: maiku, akodo

Responder
goyfilms
Forista Nuevo
Forista Nuevo
Mensajes: 7
Registrado: Dom Sep 23, 2012 9:54 pm

problemas con grep -v

Mensaje por goyfilms »

Hola, a ver si podeis echarme un cable que estoy atascado y no sé el por qué.
Tengo un archivo de texto plano en el cual hay varias lineas que se repite la palabra "Pág." y acto seguido hay otras 4 lineas más que me interesaría eliminar.
Si hago esto:
cat archivo.txt | grep -A 4 "Pág."
la salida me muestra exactamente todas las lineas que me interesa eliminar, sin embargo, si hago esto:
cat archivo.txt | grep -v -A 4 "Pág."
me debería mostrar la salida inversa que es lo que me interesa y sin embargo me muestra el contenido íntegro del archivo de texto sin filtrar.

No entiendo qué es lo que falla y no se me ocurre otra forma de conseguir lo que busco.

¿Alguna idea?

Gmaster83
Forista Medio
Forista Medio
Mensajes: 106
Registrado: Sab Abr 24, 2010 9:13 pm

Re: problemas con grep -v

Mensaje por Gmaster83 »

Segun entiendo, no puedes usar el -A 4 "Pág." como un patron de busqueda del atributo -v.

Una alternativa que se me ocurre, puede ser esta:

grep -A 4 "Pág." "archivo.txt" >patron.txt && grep -v -f "patron.txt" "archivo.txt"

Es lo unico que se me ocurrio ahora, lo que hace es guardar el patron a buscar en el archivo patron.txt y luego agregar otro comando que busque lo opuesto a ese patron.
Busca porque seguramente se puede optimizar sin utilizar archivos intermedios.

Saludos!.

Snark1994
Forista Menor
Forista Menor
Mensajes: 76
Registrado: Sab Abr 02, 2011 11:43 pm

Re: problemas con grep -v

Mensaje por Snark1994 »

Se puede hacerlo con awk:

Código: Seleccionar todo

awk '/Pág./{n++}{if(!n){print $0}else{n++;if(n>5){n=0}}}' archivo.txt
Saludos,
No soy hispanohablante - si he cometido un error con mi español, dime por favor :) me gustaría mejorarlo

goyfilms
Forista Nuevo
Forista Nuevo
Mensajes: 7
Registrado: Dom Sep 23, 2012 9:54 pm

Re: problemas con grep -v

Mensaje por goyfilms »

Snark1994 escribió:Se puede hacerlo con awk:

Código: Seleccionar todo

awk '/Pág./{n++}{if(!n){print $0}else{n++;if(n>5){n=0}}}' archivo.txt
Saludos,
muchísimas gracias. Es justo lo que buscaba.

me imaginaba que con awk se podría hacer pero es que se me resiste mogollón. Es complejísisisisisimo. De hecho aun no sé cómo funciona exactamente el comando que me pasaste.

Necesitaría una cosa más para que fuese perfecto y es que omitiera las primeras lineas del archivo hasta que encontrara la cadena "-------" (sólo una vez, ya que dicha cadena se repite varias veces en el archivo de texto).

Muchas gracias de nuevo. Flipo con que se pueda hacer lo que buscaba en una única linea.

Snark1994
Forista Menor
Forista Menor
Mensajes: 76
Registrado: Sab Abr 02, 2011 11:43 pm

Re: problemas con grep -v

Mensaje por Snark1994 »

La verdad es que es sencillo:

Código: Seleccionar todo

/Pág./ { #Para todas lineas que corresponden al patrón "Pág."
    n++;            #se aumenta 'n' - empieza con el valor cero
}
muestra {         #Para todas lineas después de '--------'
    if(!n){           #sí n == 0 (en awk, 'cero' y 'falso' son los mismos)
        print $0;   #muestra la linea
    } else {
        n++;       #se aumenta 'n'
        if(n>5){
            n=0;   #para que vuelve a muestra las lineas, hasta que se encuentra otro 'Pág.' 
        }
    }
}
/-------/ {          #Para todas lineas que corresponden al patrón -------
    muestra=1;   #muestra == 1, así que el bloque anterior correrá
    n=0;
}
Espero que lo entiendes ahora... Si no, vuelve a tratar de explicarlo :) como antes, puedes quitar todo los espacios para hacerlo una única linea:

Código: Seleccionar todo

awk '/Pág./{n++}muestra{if(!n){print $0}else{n++;if(n>5){n=0}}}/-------/{muestra=1;n=0}' archivo.txt
No soy hispanohablante - si he cometido un error con mi español, dime por favor :) me gustaría mejorarlo

goyfilms
Forista Nuevo
Forista Nuevo
Mensajes: 7
Registrado: Dom Sep 23, 2012 9:54 pm

Re: problemas con grep -v

Mensaje por goyfilms »

muchas gracias de nuevo. Pero hay un pequeño problema... el comando que me pasaste borra la primera linea que contiene "--------" y necesito que borre las anteriores a esa.

Editado -- Jue Sep 27, 2012 9:40 am --

por cierto, aprovecho para corregir tu español :)
te cito y luego lo pongo corregido:

Se puede hacerlo con awk
Se puede hacer con awk

Espero que lo entiendes ahora... Si no, vuelve a tratar de explicarlo como antes, puedes quitar todo los espacios para hacerlo una única linea
Espero que lo entiendas ahora... Si no, volveré a tratar de explicártelo. Como antes, puedes quitar todos los espacios para hacerlo en una única linea

Snark1994
Forista Menor
Forista Menor
Mensajes: 76
Registrado: Sab Abr 02, 2011 11:43 pm

Re: problemas con grep -v

Mensaje por Snark1994 »

goyfilms escribió:muchas gracias de nuevo. Pero hay un pequeño problema... el comando que me pasaste borra la primera linea que contiene "--------" y necesito que borre las anteriores a esa.
¿Quieres decir que no quieres borrar la linea con "--------", sino sólo las lineas anteriores?

Por ejemplo, ¿
No muestra...
Pág.
1
2
3
4
5
-----------
Pág.
11
12
13
14
15
Pág.
21
22
23
24
25
muestra
-----------
15
25
?

Si es así, debes reordenar las reglas:

Código: Seleccionar todo

awk '/Pág./{n++} /------/{muestra=1;n=0} muestra{if(!n){print $0}else{n++;if(n>5){n=0}}}' archivo.txt
¡Te agradezco mucho la ayuda con español!
No soy hispanohablante - si he cometido un error con mi español, dime por favor :) me gustaría mejorarlo

Responder
  • Temas similares
    Respuestas
    Vistas
    Último mensaje