在各个单独的文件之间打印行

时间:2015-10-21 07:48:50

标签: regex awk sed

我有5000多行的大文件,其重复模式如下所示:

ABC
111
222
333
XYZ

ABC
444
555
666
777
XYZ

..
..

ABC
777777777
888888888
999999999
222
333
111
XYZ

我想在每个'ABC'和'XYZ'之间提取内容并将其写入单独的文件。

例如:file1应该有

ABC
111
222
333
XYZ

File2应该有

ABC
444
555
666
777
XYZ

Filen应该有

ABC
777777777
888888888
999999999
222
333
111
XYZ

等等。

我们怎么能实现这个目标?我在下面读过这些线程,但它只写了一个文件。对我的情况没有帮助。

How to select lines between two marker patterns which may occur multiple times with awk/sed

Print lines between two patterns to new file

3 个答案:

答案 0 :(得分:4)

awk '/^ABC/{file="file"c++}{print >>file}' a

答案 1 :(得分:2)

Perl救援!

< bigfile perl -nwe 'print {$OUT} $_
                         if (/ABC/ && do { open $OUT, ">", "file" . ++$i or die $!}
                            ) ... /XYZ/'
  • n逐行读取文件
  • 仅在/ABC//XYZ/
  • 之间打印
  • /ABC/为真时,即我们重新开始新版块时,会打开一个新文件并将其与文件句柄$OUT相关联。 $i是文件的编号。

答案 2 :(得分:1)

awk '
  # setup our output file name file0, file1, file2, ...
  $0 == "ABC"{if (i) {close(f)};f="file"i++;};
  # use inclusive range match 
  $0 == "ABC",$0 == "XYZ"{print > f}
'