【发布时间】:2017-03-07 06:36:45
【问题描述】:
我正在尝试将一个大的 xml 文件拆分为多个文件,并在 AWK 脚本中使用了以下代码。
/<fileItem>/ {
rfile="fileItem" count ".xml"
print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > rfile
print $0 > rfile
getline
while ($0 !~ "<\/fileItem>" ) {
print > rfile
getline
}
print $0 > rfile
close(rfile)
count++
}
上面的代码生成一个xml文件列表,其名称为“fileItem_1”、“fileItem_2”、“fileItem3”等。
但是,我希望文件名类似于“item_XXXXX”,其中 XXXXX 是 XML 中的一个节点 - 如下所示
<fileItem>
<id>12345</id>
<name>XXXXX</name>
</fileItem>
所以,基本上我希望“id”节点是文件名。 谁能帮我解决这个问题?
【问题讨论】:
-
听起来您应该为此使用适当的 XML 工具。如果您的输入是完全有规律的,那么使用 Awk 一次将一条记录读入内存并在您到达其结束标记(或文件结尾,尽管这违反 XML)时将其刷新到磁盘可能会让您做您想做的事。简而言之,当你看到开始标签时将一个变量设置为 1,然后当变量为真时,将行累加到另一个变量中;最后,当您看到结束标记时,写出累积的行并将变量设置回 0。这是一种非常标准的 Awk 技术,因此示例应该不难找到
-
如果您曾经考虑在脚本中使用
getline,请确保您首先阅读并完全理解awk.freeshell.org/AllAboutGetline,这样您就知道自己在做什么了。 -
对于未来的读者,一个通用的解决方案比
awk命令复杂得多....为此使用 XML 工具,带有 XML 库的高级语言,带有结果的 XSLT V2.0 -文件等