如何基于<ticket>和</ticket>标签拆分大文本文件?
拆分大XML文件中每个
<ticket>块到单独文件 你的脚本问题出在这两点:
- 循环只遍历了一次目标文件,
i只会递增到1,所以只会生成一个文件 - 用的sed命令是单行替换逻辑,只能匹配同一行内的
<ticket>...</ticket>,没法处理跨多行的ticket内容,而且它没有过滤非ticket内容,导致原文件全部内容被复制
针对5GB的大文件,推荐用awk处理,它效率高且能完美处理多行匹配的场景,直接生成每个ticket对应的单独文件:
awk ' /<ticket>/{ filename = "ticket_" ++count ".xml" print > filename next } filename != ""{ print > filename if (/<\/ticket>/) { close(filename) filename = "" } } ' BF_File.xml
脚本逻辑说明
- 当匹配到
<ticket>起始行时,自动生成带编号的文件名(比如ticket_1.xml、ticket_2.xml),把当前行写入该文件后跳到下一行 - 只要
filename不为空,就持续把内容写入对应文件;当匹配到</ticket>结束行时,关闭文件并重置filename,准备处理下一个ticket块 - 加入
close(filename)是为了避免打开过多文件句柄,防止处理大量ticket时出现报错
如果你的系统支持csplit工具,也可以用这个专门的文件拆分命令:
csplit -z -f ticket_ BF_File.xml '/^<ticket>$/' '{*}'
参数解释:
-z:自动删除拆分后产生的空文件-f ticket_:设置输出文件的前缀为ticket_'/^<ticket>$/':以独立行的<ticket>作为拆分点'{*}':重复拆分操作直到文件末尾
拆分后如果每个文件里包含多余内容,再用sed过滤出完整的ticket块:
for file in ticket_*; do sed -n '/<ticket>/,/<\/ticket>/p' "$file" > temp && mv temp "$file" done
内容的提问来源于stack exchange,提问作者TheLordRev
相关产品推荐
相关产品推荐

