Shell Y出现X次后的AWK分割文件
我正在尝试将一个大文件拆分为多个文件。如果“标签”被发现1000次 这可以工作,但是为每个标记编写一个新文件。我该如何放置柜台Shell Y出现X次后的AWK分割文件,shell,awk,Shell,Awk,我正在尝试将一个大文件拆分为多个文件。如果“标签”被发现1000次 这可以工作,但是为每个标记编写一个新文件。我该如何放置柜台 awk '{print $0 RS > NR ".txt" ; close(NR".txt") }' RS="</tag>" big_file.txt awk'{print$0 RS>NR.txt;“close(NR.txt”)}'RS=”“big_file.txt 例如: 标签> bla1 blub /标签> 标签> bla2 blub /标签>
awk '{print $0 RS > NR ".txt" ; close(NR".txt") }' RS="</tag>" big_file.txt
awk'{print$0 RS>NR.txt;“close(NR.txt”)}'RS=”“big_file.txt
例如:
标签>bla1
blub
/标签>
标签>
bla2
blub
/标签>
标签>
bla3
blub
/标签>
标签>
bla4
blub
/标签>
标签>
bla5
blub
/标签>
标签>
bla6
blub
/标签>
我想要的是: 文件1: 标签>
bla1
blub
/标签>
标签>
bla2
blub
/标签>
标签>
bla3
blub
/标签>
文件2: 标签>
bla4
blub
/标签>
标签>
bla5
blub
/标签>
标签>
bla6
blub
/标签>
等等
非常感谢出于良心,我不能容忍使用作为RS的值(RS只有在它是单个字符或空的情况下才有很好的定义,尽管在某些实现中可能更长。但更重要的是,以这种方式解析xml非常脆弱),但是,如果您有一个喜欢使用NR为每条记录编写新文件的解决方案,您只需将
NR
替换为int(NR/1000)
,即可获得所需的行为。您的命令
awk '{print $0 RS > NR ".txt" ; close(NR".txt") }' RS="</tag>" big_file.txt
它将整个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
awk'num=2{file=sprintf(“小文件%s.txt”,int(delim/num));print>file;}/^\/tag>$/{delim++}
此处变量num是所需的出现次数 “标签”是什么?举个例子会很有用,最好少于1000行!希望这个例子没问题:-)@mickmack-我的理解是,你想把一个大文件拆分成多个小文件,但没有一个小文件有超过1000次的字符串“tag”。正确吗?不,我想要一些小文件,但不是标记>和/tag>之间的每个部分。应包括标记>和/标记>。这是一个非常大的xml文件,我想拆分。对不起,我是awk新手,希望这个问题不是完全胡说八道。
awk 'num = 2 { file = sprintf("small_file%s.txt", int(delim / num)); print > file; } /^\/tag>$/ { delim++ }' < big_file.txt