2009-10-22 97 views
0

基本上,我通過從表的列中獲取值來創建XML文件。 我這樣開始從一個shell腳本的AWK腳本(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

什麼樣的「awk錯誤」? – ndim 2009-10-22 16:51:34

+1

-1沒有給出錯誤信息。 – 2009-10-22 18:46:07

+0

@Peter Mortensen:我不認爲維基百科鏈接對於像awk和ksh這樣衆所周知的事情是必需的。 – 2009-10-22 18:57:50

回答

3

如果您收到類似這樣的錯誤:

END { 
    ... 
0

這條線:

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

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

經開托架移動到同一條線上端固定代碼

可能一樣容易:

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

您可能需要引用'「$ SQL_RESULT」' – 2009-10-22 18:45:30

+0

您是對的。我聲稱複製粘貼itis。 – 2009-10-22 18:58:49

0

,因爲你正在使用AWK已經,沒有必要使用像TR SED或其他工具與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>" 
     } 


} 
' 
相關問題