Xml 如何在awk中循环后打印单行?

Xml 如何在awk中循环后打印单行?,xml,loops,csv,awk,Xml,Loops,Csv,Awk,我有一个awk脚本,它打印头信息,然后循环通过csv文件来创建xml输出。我想在循环完成后打印一行,但是下面的脚本将标记放在每一行之后,而不仅仅放在文件的末尾。我怎么了 BEGIN { FS="," } NR==1 { {print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > "output.xml" } {print "<Batch>" > "output.xml" } {print " <ASWFi

我有一个awk脚本,它打印头信息,然后循环通过csv文件来创建xml输出。我想在循环完成后打印一行,但是下面的脚本将标记放在每一行之后,而不仅仅放在文件的末尾。我怎么了

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的文件。我需要标记仅位于文件的底部,而不是从一行生成的每个段的末尾。你知道我做错了什么吗?

你可能是说

END {print "</Batch>" > "output.xml" }
END{print”“>“output.xml”}
代码的其余部分也很糟糕,为什么您要重定向每一次写入,而不是简单地重定向整个输出?

您的意思可能是

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

代码的其余部分也很糟糕,为什么你要重定向每一次写入,而不是简单地重定向整个输出?

每个
print
语句周围的
NR==1
块中的大括号没有做任何有用的事情。每个
print
语句周围的
NR==1
块中的大括号没有做任何有用的事情。我对它很陌生编码,我所有的经验都是SQL,所以我还不知道最佳实践。这很有效,谢谢你。您建议我如何重定向输出,如下所示?sudo gawk-f tst.awk customers.csv>output.xmlYes。我对编码非常陌生,我所有的经验都是SQL,所以我还不知道最佳实践。这很有效,谢谢你。您建议我如何重定向输出,如下所示?sudo gawk-f tst.awk customers.csv>output.xmlYes。这是更短、更灵活和更高效的。