我需要根据大致的行数(例如示例中的~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解决方案!
答案 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