Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell Y出现X次后的AWK分割文件_Shell_Awk - Fatal编程技术网

Shell Y出现X次后的AWK分割文件

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 /标签>

我正在尝试将一个大文件拆分为多个文件。如果“标签”被发现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
/标签>

标签>
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