【问题标题】:How do I print a single line after a loop in awk?如何在 awk 循环后打印一行?
【发布时间】:2017-10-07 04:18:59
【问题描述】:

我有一个打印标题信息的 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" }

我使用以下命令:

sudo gawk -f tst.awk customers.csv 

运行文件。输入文件是customers.csv,该文件具有成为标签的标题。该脚本会生成一个名为 output.csv 的文件。我需要标签仅位于文件的底部,而不是位于从一行生成的每个段的末尾。任何想法我做错了什么?

【问题讨论】:

  • 每个print 语句周围的NR==1 块内的大括号没有任何用处。

标签: xml loops csv awk


【解决方案1】:

你可能是说

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

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

【讨论】:

  • 我对编码非常陌生,我所有的经验都是在 SQL 中,所以我还不知道最佳实践。那行得通,谢谢。你会如何建议我重定向输出,像这样? sudo gawk -f tst.awk customers.csv > output.xml
  • 是的。这样更短、更灵活、更高效。
猜你喜欢
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 2020-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多