【问题标题】:Why does this AWK script cause a syntax error?为什么这个 AWK 脚本会导致语法错误?
【发布时间】:2010-12-09 04:07:00
【问题描述】:

基本上,我通过从表的列中获取值来创建 XML 文件。 我正在从 shell 脚本(ksh,如果重要的话)启动一个AWK 脚本,如下所示:

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 错误。

这有什么问题?

【问题讨论】:

  • -1 表示没有给出错误信息。
  • @Peter Mortensen:我认为 Wikipedia 链接对于 awk 和 ksh 等众所周知的东西是不必要的。

标签: unix shell scripting sed awk


【解决方案1】:

如果您收到类似以下的错误:

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

通过将左括号移动到与 END 相同的行来修复您的代码:

END {
    ...

【讨论】:

    【解决方案2】:

    这一行:

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

    【讨论】:

    • 你可能需要引用"$SQL_RESULT"
    【解决方案3】:

    由于您已经在使用 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>"
          }
    
    
    }
    '
    

    【讨论】:

      猜你喜欢
      • 2012-05-14
      • 2015-05-15
      • 1970-01-01
      • 1970-01-01
      • 2015-08-02
      • 2015-06-12
      • 2016-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多