我正在尝试将一个大文件拆分成多个文件。如果“标签”被发现1000次。
这可以工作,但为每个标签写一个新文件。我应该如何摆放柜台?
awk '{print $0 RS > NR ".txt" ; close(NR".txt") }' RS="</tag>" big_file.txt
例如:
标签&GT;
bla1
blub
/标签&GT;
标签&GT;
bla2
blub
/标签&GT;
标签&GT;
bla3
blub
/标签&GT;
标签&GT;
bla4
blub
/标签&GT;
标签&GT;
bla5
blub
/标签&GT;
标签&GT;
bla6
blub
/标签&GT;
我想要的是什么:
文件1:
标签&GT;
bla1
blub
/标签&GT;
标签&GT;
bla2
blub
/标签&GT;
标签&GT;
bla3
blub
/标签&GT;
文件2:
标签&GT;
bla4
blub
/标签&GT;
标签&GT;
bla5
blub
/标签&GT;
标签&GT;
bla6
blub
/标签&GT;
等等
非常感谢
答案 0 :(得分:2)
你的命令
awk '{print $0 RS > NR ".txt" ; close(NR".txt") }' RS="</tag>" big_file.txt
与我的awk版本不同(我使用mawk 1.3.3)。而不是将 big_file.txt 拆分为每个模式的许多文件
tag>
...
/tag>
它将 big_file.txt 的整个上下文写入文件 1.txt 。
但是为了解决您的问题,您可以尝试使用 sprintf 功能。对我来说,以下命令有效:
awk 'num = 2 { file = sprintf("small_file%s.txt", int(delim / num)); print > file; } /^\/tag>$/ { delim++ }' < big_file.txt
此处变量 num 是所需的出现次数。
答案 1 :(得分:1)
我不能宽容地使用</tag>
来获取RS的值(RS只有在单个字符时才能很好地定义,或者为空,尽管在某些实现中它可能更长。但更重要的是,解析xml这种方式非常脆弱),但是如果你有一个解决方案,你喜欢使用NR为每条记录写一个新文件,你可以简单地用NR
替换int(NR/1000)
来获得你想要的行为