为什么这个AWK脚本会导致语法错误?

时间:2009-10-22 16:38:56

标签: unix shell scripting sed awk

基本上,我是通过从表的列中获取值来创建XML文件。 我正在从shell脚本(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 个答案:

答案 0 :(得分:3)

如果您收到与此类似的错误:

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

通过将左括号移动到与END:

相同的行来修复代码
END {
    ...

答案 1 :(得分:0)

这一行:

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' )

答案 2 :(得分:0)

因为你已经使用了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>"
      }


}
'