Buscar líneas en ficheros: “awk is your friend”.

Las herramientas de carga de Teradata ponen en una tabla filas con información de los registros (líneas) que han fallado (lo mismo hace Oracle con su sql*loader utilizando ficheros y ‘logs’).

En cualquier caso, muchas veces hay que ver qué esta fallando en la línea y, eventualmente, editarla para corregir los errores.

Esto se puede hacer fácilmente con un mero editor de texto… si el fichero no es muy grande, claro. Pero ocurre que actualmente estoy tabajando con herramientas Teradata (fastload, multiload) para cargar en la base de datos ficheros de 15 o 20 Gb.

Por supuesto, ni intentar abrir un monstruo de estos con un editor.

Otra posibilidad es hacer algo así:

$ head nombre_fichero -n numero_línea | tail -n 1

Pero intentad hacer:

$ head nombre_fichero -n 182358216 | tail -n 1

y veréis lo que pasa.

Así que pensando, pensando, se me ocurrió recurrir al temido awk (¡awk!¡Qué miedo!). Pero no es para tanto.
Un poco de lectura del ‘man’, documentación, etc, etc y terminé discurriendo esto:

$ awk 'NR == numero_línea {print}' nombre_fichero

Los resultados son mucho más rápidos que con head/tail. Así, para un fichero con 188660096 líneas que tenía cuatro ‘pochas’ hice :

$ awk 'NR == 182358216 {print}' fichero_grande.txt > fichero_grande_bad.txt

$ awk 'NR == 103504305 {print}' fichero_grande.txt >> fichero_grande_bad.txt

$ awk 'NR == 165070071 {print}' fichero_grande.txt >> fichero_grande_bad.txt

$ awk 'NR == 182358218 {print}' fichero_grande.txt >> fichero_grande_bad.txt

y en pocos minutos tenía las cuatro líneas en un fichero a mi disposición.

Y lo mejor: ¡¡ejecutado con (el para mí imprescindible) cygwin en un entorno Windows!!

Saludos.

Carlos.

2 respuestas a Buscar líneas en ficheros: “awk is your friend”.

  1. klashxx dice:

    Hola Carlos , en primer lugar darte la enhorabuena por tu trabajo , material de alta calidad para los que nos peleamos con Teradata.

    “Culturizándome “ con las entradas de tu blog me he encontrado con este post y me permito hacerte una sugerencia “tonta”.

    Añadiendo el comando exit después del print al awk , este terminara su ejecución inmediatamente después de “encontrar la línea” con el consiguiente ahorro de recursos si su localización es lejana respecto al final del fichero.

    Por ejemplo:

    awk 'NR == 182358218 {print;exit}' fichero_grande.txt

    Más detalle en: http://nixtip.wordpress.com/2011/09/21/plain-text-the-language-of-nix/

    Saludos.

    Juan Diego

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: