Por que esse script AWK causa um erro de sintaxe?
Pergunta
Basicamente, eu estou criando um arquivo XML utilizando os valores de uma coluna de uma tabela. Estou começando um href="http://en.wikipedia.org/wiki/AWK" rel="nofollow noreferrer"> AWK roteiro de um shell script ( ksh se importa) como este:
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
O script AWK, awl.file, contém:
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>"
}
Quando eu executar o script dá-me um erro AWK.
Qual é o problema com isso?
Solução
Se você estiver recebendo um erro semelhante a este:
awk: syntax error at source line 9 source file xml.awk
context is
END >>>
<<< {
awk: bailing out at source line 12
Corrigir o seu código, movendo o suporte aberto para a mesma linha END:
END {
...
Outras dicas
Esta linha:
FILE_LIST=`echo "$SQL_RESULT"|sed -e 's/\n/''/g'`
poderia facilmente ser:
FILE_LIST=`echo "$SQL_RESULT"|sed -e 's/\n//g'`
mas também não se faz nada. Se sua intenção é substituir todas as novas linhas com uma cadeia nula, em seguida, faça o seguinte:
FILE_LIST=$( echo "$SQL_RESULT" | tr -d "\n" )
ou com um espaço:
FILE_LIST=$( echo "$SQL_RESULT" | tr "\n" " " )
Se você realmente deseja substituir todas as novas linhas com um par de aspas simples, isso é um pouco mais complicado:
FILE_LIST=$( echo "$SQL_RESULT" | sed -e '1{h};${x;s/\n/'\'\''/g;p};H;d' )
desde que você está usando awk já, não é necessário usar sed ou outras ferramentas como tr para substituir newlines com nul.
@OP, problema pode estar no seu quoting..but isso é apenas um palpite. mostrar a sua saída SQL para posterior análise
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>"
}
}
'