Почему этот скрипт AWK вызывает синтаксическую ошибку? - PullRequest
0 голосов
/ 22 октября 2009

По сути, я создаю файл XML, беря значения из столбца таблицы. Я запускаю сценарий AWK из сценария оболочки ( ksh , если это имеет значение) следующим образом:

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

Скрипт AWK, awl.file, содержит:

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>"
      }

Когда я запускаю скрипт, он выдает ошибку AWK.

В чем проблема с этим?

Ответы [ 3 ]

3 голосов
/ 22 октября 2009

Если вы получаете сообщение об ошибке, похожее на это:

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

Исправьте код, переместив открытую скобку в ту же строку, что и END:

END {
    ...
0 голосов
/ 23 октября 2009

, поскольку вы уже используете awk, нет необходимости использовать sed или другие инструменты, такие как tr, чтобы заменить символы новой строки на nul.

@ OP, проблема может быть в вашем цитировании ... но это только предположение. показать вывод sql для дальнейшего анализа

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>"
      }


}
'
0 голосов
/ 22 октября 2009

Эта строка:

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

может быть так же легко:

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

но никто ничего не делает. Если вы намереваетесь заменить все символы новой строки пустой строкой, сделайте следующее:

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

или с пробелом:

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

Если вы действительно хотите заменить все символы новой строки на пару одинарных кавычек, это немного сложнее:

FILE_LIST=$( echo "$SQL_RESULT" | sed -e '1{h};${x;s/\n/'\'\''/g;p};H;d' )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...