按awk / perl中的行数和模式拆分文件

时间:2014-09-07 17:03:35

标签: perl awk

我需要根据大致的行数(例如示例中的~4,实际上是数千)将文件拆分为块,而每个文件必须以在每个块中多次出现的模式开始。

一个块需要从START开始,而不是以START结尾,并且>长达3行

输入文件:

START
LINE
LINE
START
LINE 
LINE 
START
LINE 
LINE 
LINE 
START
LINE 
START
LINE

所需的输出文件:

档案1

START
LINE
LINE
START
LINE
LINE

文件2

START
LINE 
LINE 
LINE 

档案3

START
LINE 
START
LINE

以下代码的问题是,/^START/的第二次出现包含在文件1的末尾,当它应该位于文件2的开头时。我无法弄清楚如何获取下一个记录为/^START/时要输出的文件。没有我可以使用的结束模式。

awk '/^START/{f=1} f{ print $0 > "file_"n ; c++} c>3 && /^START/ { n++; c=1; close("file_"n) }' c=1 n=1 file

非常感谢awk或perl解决方案!

1 个答案:

答案 0 :(得分:1)

这会产生您想要的输出:

awk -v out=1 'NR>1 && ++i>3 && /^START/ {++out; i=0} {print > "file" out}' file

当满足所有条件时,递增out,这是输出文件名的一部分。

输出:

$ cat file1
 0 START
 1 LINE
 2 LINE
 3 START
 4 LINE 
 5 LINE 
$ cat file2
 6 START
 7 LINE 
 8 LINE 
 9 LINE 
$ cat file3
10 START
11 LINE 
12 START
13 LINE