¿Por qué este script AWK causa un error de sintaxis?
Pregunta
Básicamente, estoy creando un archivo XML al tomar los valores de una columna de una tabla. Estoy iniciando un script AWK desde un script de shell ( ksh si es importante) como esto:
SQL_RESULT=`sqlplus -s ${CONNECT_STRING} << EOF
${SQLPLUS_SETTINGS}
select customer_id from GD9_GENTH_CUST_SUBSCR;
exit;
EOF`
FILE_LIST=`echo $SQL_RESULT|sed -e 's/\n/''/g'`
echo $FILE_LIST|awk -f awk.file
El script AWK, awl.file, contiene:
BEGIN {
print "<?xml version=\"1.0\" encoding=\"UTF-8\"?><GenTransactionHandler xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><EntityToPublish>\n<Entity type=\"C\" typeDesc=\"Customer level\"><TargetApplCode>UHUNLD</TargetApplCode><TrxName>GET_CUST_DATA</TrxName>"
}
{
print "<value>"$1"</value>"
}
END
{
print "</Entity>\n</EntityToPublish></GenTransactionHandler>"
}
Cuando ejecuto el script, me da un error de AWK.
¿Cuál es el problema con esto?
Solución
Si recibe un error similar a este:
awk: syntax error at source line 9 source file xml.awk
context is
END >>>
<<< {
awk: bailing out at source line 12
Corrija su código moviendo el corchete abierto a la misma línea que FINAL:
END {
...
Otros consejos
Esta línea:
FILE_LIST=`echo "$SQL_RESULT"|sed -e 's/\n/''/g'`
podría ser igual de fácil:
FILE_LIST=`echo "$SQL_RESULT"|sed -e 's/\n//g'`
pero ninguno hace nada. Si su intención es reemplazar todas las líneas nuevas con una cadena nula, haga esto:
FILE_LIST=$( echo "$SQL_RESULT" | tr -d "\n" )
o con un espacio:
FILE_LIST=$( echo "$SQL_RESULT" | tr "\n" " " )
Si realmente quieres reemplazar todas las nuevas líneas con un par de comillas simples, eso es un poco más complicado:
FILE_LIST=$( echo "$SQL_RESULT" | sed -e '1{h};${x;s/\n/'\'\''/g;p};H;d' )
dado que ya está usando awk, no es necesario usar sed u otras herramientas como tr para reemplazar nuevas líneas con nul.
@OP, el problema puede estar en tu cita ... pero eso es solo una suposición. muestra tu salida de SQL para un análisis más profundo
SQL_RESULT=`sqlplus -s ${CONNECT_STRING} << EOF
${SQLPLUS_SETTINGS}
select customer_id from GD9_GENTH_CUST_SUBSCR;
exit;
EOF` | awk 'BEGIN{
q="\042"
print "<?xml version="q"1.0"q" encoding="q"UTF-8"q"?><GenTransactionHandler xmlns:xsi="q"http://www.w3.org/2001/XMLSchema-instance"q"><EntityToPublish>\n<Entity type="q"C"q" typeDesc="q"Customer level"q"><TargetApplCode>UHUNLD</TargetApplCode><TrxName>GET_CUST_DATA</TrxName>"
}
{
gsub("\n","") # this is the same as your sed command...but also depends on SQL output
print "<value>"$1"</value>"
}
END
{
print "</Entity>\n</EntityToPublish></GenTransactionHandler>"
}
}
'