我需要将一个具有 4 个节点的 XML 文件拆分为 4 个文件。给定一个这样的文件:
sddskjdsfds
asdadsa
20:15:12 st: <aRoot>
<aNode>v</aNode>
<otherNode a="2"/>
</aRoot>
kjfsdfj
20:15:59 r: <otherRoot>
<bNode>h</bNode>
</otherRoot>
sddskjdsfds
asdadsa
22:31:32 st: <aRoot>
<aNode>a</aNode>
<otherNode a="1"/>
</aRoot>
kjfsdfj
22:31:39 r: <otherRoot>
<bNode>o</bNode>
</otherRoot>
other-random-lines
我需要将它分成 4 个文件:* aRoot_1.xml
, aRoot_2.xml
, otherRoot_1.xml
, otherRoot_2.xml
.
到目前为止我已经取得了:
awk '/st:/,/<\/aRoot>/' file.txt > all_aRoots.txt
<otherRoot>
的类似方法: 另一个电话 awk
, 写信给 all_otherRoots.txt
等
但这会保留 </aroot>
之前的所有字符, 并导致所有 <aRoot>
在outputfile
.
如何使用 Bash 将具有 4 个 xml 节点的日志文件拆分为 4 个文件? 更新 #1: 请注意非 xml 行,必须将它们排除在外,并且,如果可能,以非 xml 文本开头的 XML 行必须仅保留 XML 部分
更新#2: 来自 RavinderSingh13 答案的示例输出文件:
sddskjdsfds
asdadsa
20:15:12 st: <aRoot>
<aNode>v</aNode>
<otherNode a="2"/>
最佳答案
能否请您尝试以下。
awk -F"[><]" '
/^<\//{
out_file=ind"_"array[ind]".xml"
print val > (out_file)
close(out_file)
val=ind=""
}
/^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/{
ind=$(NF-1)
array[$(NF-1)]++
}
{
val=(val?val ORS:"")$0
}
' Input_file
编辑:添加代码以删除 OP 开始不需要的行。
awk -F"[><]" '
/^<\//{
out_file=ind"_"array[ind]".xml"
flag=1
if(val){
print val > (out_file)
}
close(out_file)
val=ind=""
}
/^[0-9][0-9]:[0-9][0-9]:[0-9][0-9]/{
ind=$(NF-1)
array[$(NF-1)]++
}
flag{
val=(val?val ORS:"")$0
}
' Input_file
关于xml - 如何使用 Bash 将具有 4 个 xml 节点的日志文件拆分为 4 个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58108785/