Pourquoi ce script AWK provoque-t-il une erreur de syntaxe?

Fondamentalement, je crée un fichier XML en prenant les valeurs d’une colonne d’une table. Je commence un script AWK à partir d’un script shell ( ksh si c’est important) comme ceci:

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 

Le script AWK, awl.file, contient:

 BEGIN { print "\nUHUNLDGET_CUST_DATA" } { print ""$1"" } END { print "\n" } 

Lorsque je lance le script, cela me donne une erreur AWK.

Quel est le problème avec cela?

Si vous obtenez une erreur similaire à celle-ci:

 awk: syntax error at source line 9 source file xml.awk context is END >>> <<< { awk: bailing out at source line 12 

Corrigez votre code en déplaçant le crochet ouvert sur la même ligne que END:

 END { ... 

Cette ligne:

 FILE_LIST=`echo "$SQL_RESULT"|sed -e 's/\n/''/g'` 

pourrait tout aussi bien être:

 FILE_LIST=`echo "$SQL_RESULT"|sed -e 's/\n//g'` 

mais personne ne fait rien. Si votre intention est de remplacer toutes les nouvelles lignes par une chaîne vide, faites ceci:

 FILE_LIST=$( echo "$SQL_RESULT" | tr -d "\n" ) 

ou avec un espace:

 FILE_LIST=$( echo "$SQL_RESULT" | tr "\n" " " ) 

Si vous voulez réellement remplacer toutes les nouvelles lignes par une paire de guillemets simples, c’est un peu plus compliqué:

 FILE_LIST=$( echo "$SQL_RESULT" | sed -e '1{h};${x;s/\n/'\'\''/g;p};H;d' ) 

Puisque vous utilisez déjà awk, il n’est pas nécessaire d’utiliser sed ou d’autres outils comme tr pour remplacer les nouvelles lignes par nul.

@OP, le problème est peut-être dans vos citations..mais c’est juste une conjecture. affichez votre sortie SQL pour une parsing plus approfondie

 SQL_RESULT=`sqlplus -s ${CONNECT_STRING} << EOF ${SQLPLUS_SETTINGS} select customer_id from GD9_GENTH_CUST_SUBSCR; exit; EOF` | awk 'BEGIN{ q="\042" print "\nUHUNLDGET_CUST_DATA" } { gsub("\n","") # this is the same as your sed command...but also depends on SQL output print ""$1"" } END { print "\n" } } '