このAWKスクリプトが構文エラーを引き起こすのはなぜですか?
質問
基本的に、テーブルの列から値を取得してXMLファイルを作成しています。 シェルスクリプトから AWK スクリプトを開始していますen.wikipedia.org/wiki/Korn_shell "rel =" nofollow noreferrer "> 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エラーが発生します。
これの問題は何ですか?
解決
次のようなエラーが表示される場合:
awk: syntax error at source line 9 source file xml.awk
context is
END >>>
<<< {
awk: bailing out at source line 12
オープンブラケットをENDと同じ行に移動してコードを修正します:
END {
...
他のヒント
この行:
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' )
すでにawkを使用しているため、改行をnulに置き換えるためにsedまたはtrなどの他のツールを使用する必要はありません。
@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>"
}
}
'
所属していません StackOverflow