2017-05-09 4 views
0

私はヘッダー情報を出力するawkスクリプトを持っていて、次にcsvファイルをループしてxml出力を作成します。ループが完了した後に1行だけを出力したいのですが、次のスクリプトは、ファイルの最後ではなく各行の後にタグを置きます。何が間違っていますか?ファイルを実行するためにawkのループの後に1行を出力するにはどうすればよいですか?

sudo gawk -f tst.awk customers.csv 

:私は、次のコマンドを使用し

BEGIN { FS="," } 
NR==1 { 
{print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > "output.xml" } 
{print "<Batch>" > "output.xml" } 
{print " <ASWFileVersion>" > "output.xml" } 
{print " <Application>Batch Maintenance</Application>" > "output.xml" } 
{print " <FileFormat>BATCH_XML_01</FileFormat>" > "output.xml" } 
{print " <Release> </Release>" > "output.xml" } 
{print " </ASWFileVersion>" > "output.xml" } 
{print " <BatchHeader>" > "output.xml" } 
{print " <BatchId>965</BatchId>" > "output.xml" } 
{print " <UserBatchId>965</UserBatchId>" > "output.xml" } 
{print " <BatchType>O</BatchType>" > "output.xml" } 
{print " <Description>Brdata Customer Import</Description>" > "output.xml" } 
{print " <CreatedOn>2014-12-05T12:35:30.3930000-05:00</CreatedOn>" > "output.xml" } 
{print " <TargetData>BatchCustomer</TargetData>" > "output.xml" } 
{print " <SaleLevel>0</SaleLevel>" > "output.xml" } 
{print " <Status> </Status>" > "output.xml" } 
{print " <ErrorMessage> </ErrorMessage>" > "output.xml" } 
{print " </BatchHeader>" > "output.xml" } 
for (i=1; i<=NF; i++) { 
     tags[i] = $i 
    } 
    next 
} 
{ 
    print "<BatchCustomer>" > "output.xml" 
    for (i=1; i<=NF; i++) { 
     printf " <%s>%s</%s>\n", tags[i], $i, tags[i] > "output.xml" 
    } 
    print "</BatchCustomer>" > "output.xml" 
} 
{print "</Batch>" > "output.xml" } 

。入力ファイルはcustomers.csvで、ファイルにはタグとなるヘッダーがあります。このスクリプトは、output.csvというファイルを生成します。私は、ファイルの一番下にタグを置く必要があり、行から生成される各セグメントの最後ではありません。私が間違っていたアイデアは何ですか?

+0

各 'print'ステートメントの周りの' NR == 1'ブロック内の中カッコは何も役立たない。 – tripleee

答えて

2

あなたはおそらく、コードの残りの部分もかなり悪いです、そして、なぜあなたは、すべての書き込みリダイレクトする代わりに、単純に全体の出力をリダイレクトする

END {print "</Batch>" > "output.xml" } 

を意味ですか?

+0

私はコーディングに非常に慣れています。私の経験はすべてSQLであり、ベストプラクティスはまだ分かりません。 うまくいきました、ありがとうございます。 出力をリダイレクトする方法を教えてください。 sudo gawk -f tst.awk customers.csv> output.xml –

+0

はい。それはより短く、より柔軟でより効率的です。 –

関連する問題