Regex 打印各个单独文件之间的图案行

Regex 打印各个单独文件之间的图案行,regex,awk,sed,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”之间的内容,并将其写入一个单独的文件 例如:文件1应该有 ABC 111 222 333 XYZ ABC 777777777 888888888 999999999 222 333 111 XYZ 文件

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

ABC
111
222
333
XYZ

ABC
444
555
666
777
XYZ

..
..

ABC
777777777
888888888
999999999
222
333
111
XYZ
我想提取每个“ABC”和“XYZ”之间的内容,并将其写入一个单独的文件

例如:文件1应该有

ABC
111
222
333
XYZ
ABC
777777777
888888888
999999999
222
333
111
XYZ
文件2应该有

ABC
444
555
666
777
XYZ
菲林应该有

ABC
111
222
333
XYZ
ABC
777777777
888888888
999999999
222
333
111
XYZ
等等

我们如何才能做到这一点?我读了下面这些线程,但它只写一个文件。对我的案子没有帮助

Perl来营救吧

< bigfile perl -nwe 'print {$OUT} $_
                         if (/ABC/ && do { open $OUT, ">", "file" . ++$i or die $!}
                            ) ... /XYZ/'
”,“file”。++$i或die$!}
) ... /XYZ/'
  • n
    逐行读取文件
  • 仅当介于
    /ABC/
    /XYZ/
  • /ABC/
    为true时,即我们正在启动一个新节,将打开一个新文件并与文件句柄
    $OUT
    关联
    $i
    是文件的编号

做得好,您可以在
XYZ
之后添加一个结束会话,以避免像这样的
awk'/^ABC/{file=“file”c++;w=1}w{print>>file}/^XYZ/{w=0}'a
之后出现空行;awk'/^ABC/{file=“file”c++;a=1}a{print>>file}/^XYZ/{a=0}如果你速度快,我还在编辑/粘贴回复:-)哇!!!Awk是如此强大…非常感谢a-Ray…它成功了。多亏了NeronLeVelu。感谢你们两位的帮助。实际上,这是两个不相关的问题:(a)使用
>
仅仅意味着,如果在调用
awk
命令之前已经存在给定的输出文件,它将被附加到;(b) 无论您使用的是
还是
>
,打开新文件时不显式关闭文件都可能会导致大量输出文件的文件句柄用尽。非常感谢Choroba。我将保留这个perl脚本,稍后将使用它。谢谢你的时间和帮助。做得好;我建议对文件句柄使用非
${O}
的内容,因为很容易将其与
${0}
(零)混淆。有了
-w
标志,您实际上会在这里得到一个关于只使用
$i
一次的警告(PerlV5.18.2);省略
-w
的另一种方法是在
开始{$i}
之前加上前缀。此外,考虑到范围的开始行和结束行预期位于不同的行上,使用
..
比使用
更好。
-我假设重复使用相同的文件句柄会隐式关闭以前打开的文件是否正确?感谢更新,但据我所知,您不需要显式截断文件-只需使用
print>f
代替
print>>f
awk
中的重定向操作符的工作方式与shell不同:在
awk
脚本中,在每次迭代中使用
不会每次都重新创建文件;相反,它将在第一次访问时隐式打开/截断文件,然后继续追加,直到文件关闭(显式或在
awk
终止时隐式关闭)。@mklement0 sweet不知道这一点。我完全同意awk:-)@mklement0当然可以,但您能否详细说明一下未关闭的处理程序会发生什么情况?我的意思是,当awk终止时,它不会被关闭吗?是的,它们最终会自动关闭,但是如果有大量的输出文件,您可能会在脚本完成之前用完文件句柄。