jueves, 17 de julio de 2008

Tratamiento de líneas con awk

A veces resulta muy útil generar un texto a partir de una consulta u otro texto. Para esto es interesante poder recorrer las diferentes líneas. En awk utilizamos una variable propia que es un puntero que apunta a la línea actual. Esta variable es NR.

Es decir, imaginemos que queremos generar unos índices de Oracle, a partir de una consulta generamos un fichero spool en el que obtenemos los CREATE y ANALYZE.

Pero claro, los tenemos todos en un mismo spool. Si queremos separarlos en diferentes ficheros para podemos lanzar las creaciones de índice en paralelo podemos hacer lo siguiente:

#Quitamos las líneas vacías

sed '/^ *$/d'/tmp/genera_indices_renombrado.txt>/tmp/genera_indices_renombrado.txt.new
#Quitamos las líneas vacías. Este punto es muy incesante ya que Oracle es muy
#propenso a colocarnos líneas vacías. Más si vamos a trabar con NR de awk

#Primero cargamos el spool con los datos
cat /tmp/genera_indices_renombrado.txt.new|awk '

#Ahora nos situamos en la primera línea con NR y comenzamos un bucle

{q=0}{linea[NR]=$0}

END {

for(i=1;i<=NR;i=i+1)

#Si la línea comienza con CREATE entramos en la condición

{if (linea[i] ~ /CREATE/)
#Abrimos el fichero con un spool hacia el log
print "spool /tmp/spooltemp"q".log;">>"/tmp/sqltemp"q".sql";
# Y escribimos la línea del CREATE
print linea[i]>>"/tmp/sqltemp"q".sql"}

else
#Si no entramos en la condición escribimos la línea del ANALYZE
{print linea[i]>>"/tmp/sqltemp"q".sql"
#Y cerramos el fichero actual (con un spool off y con un exit).
print "spool off">>"/tmp/sqltemp"q".sql";
print "exit;">>"/tmp/sqltemp"q".sql";
#pasamos al siguinte fichero

q=q+1; }

}
#Escribimos el último exit
{print "exit;">>"/tmp/sqltemp"q".sql"}}'

Y con esto hemos separado las líneas que nos interesaban en diferentes ficheros.

2 comentarios:

Patito dijo...

estáis seguros que publicar esto no incumple la claúsula de confidencialidad de vuestra empresa??

Ivan Martinez dijo...

No lo creo.
También he aprendido a usar parámetros del comando ls que voy a seguir usando cuando salga de mi actual empresa.

Incluso le contaré a otros como usarlo.

Es lo que tiene el conocimiento, no se le pueden poner muros a lo intangible.