Mostrando entradas con la etiqueta awk. Mostrar todas las entradas
Mostrando entradas con la etiqueta awk. Mostrar todas las entradas

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.