在第N次出现分隔符时拆分文件

cmo*_*cmo 11 unix split file chunking

在每第N次出现分隔符后,是否存在将文本文件拆分为多个块/块的单行内容?

示例:下面的分隔符是"+"

entry 1
some more
+
entry 2
some more
even more
+
entry 3
some more
+
entry 4
some more
+
...
Run Code Online (Sandbox Code Playgroud)

有几百万个条目,因此每次出现分隔符"+"时都要分开是一个坏主意.我想分开,例如,每隔50,000个分隔符"+"实例.

Unix命令"split"和"csplit"似乎没有这样做......

Fat*_*ror 13

使用awk你可以:

awk '/^\+$/ { delim++ } { file = sprintf("chunk%s.txt", int(delim / 50000)); print >> file; }' < input.txt 
Run Code Online (Sandbox Code Playgroud)

更新:

要不包括分隔符,请尝试以下操作:

awk '/^\+$/ { if(++delim % 50000 == 0) { next } } { file = sprintf("chunk%s.txt", int(delim / 50000)); print > file; }' < input.txt 
Run Code Online (Sandbox Code Playgroud)

next关键字使awk暂停此记录的处理规则,并前进到下一个(行).我也改变了>>,>因为如果你不止一次运行它,你可能不想附加旧的块文件.

  • 从gawk手册"使用`>',`>>'或`|'重定向输出 要求系统仅在您指定的特定文件或命令尚未被您的程序写入时,或者自上次写入以来已关闭时才打开文件或管道." 所以它与在shell中执行它有点不同. (2认同)