【问题标题】:print lines between patterns individual separate files打印图案之间的线条单独的单独文件
【发布时间】:2016-01-20 02:52:04
【问题描述】:

我有一个包含 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

文件2应该有

ABC
444
555
666
777
XYZ

文件应该有

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

【问题讨论】:

    标签: regex awk sed


    【解决方案1】:

    Perl 来救援!

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

    【讨论】:

    • 非常感谢 Choroba。我将保留这个 perl 脚本并在以后使用它。感谢您抽出宝贵时间帮助我。
    • 干得好;我建议使用${O} 以外的其他东西作为文件句柄,因为它很容易与${0}(零)混淆。使用-w 标志,您实际上会在此处收到关于仅使用一次$i 的警告(Perl v5.18.2);省略-w 的另一种方法是在前面加上BEGIN{$i}。此外,鉴于范围的开始和结束行预计在 不同 行上,使用 ... 比使用 .. 更好 - 我是否正确假设重用相同的文件句柄隐式关闭之前打开的文件?
    【解决方案2】:
    awk '/^ABC/{file="file"c++}{print >>file}' a
    

    【讨论】:

    • 干得好,您可以添加一个结束 session 以避免在 XYZ 之后出现空行,例如 awk '/^ABC/{file="file"c++;w=1}w{print &gt;&gt;file} /^XYZ/{w=0}' a
    • 像这样; awk '/^ABC/{file="file"c++;a=1}a{print >>file}/^XYZ/{a=0}' a
    • 对,你很快,我还在编辑/粘贴回复:-)
    • 哇! awk 是如此强大...非常感谢 A-Ray ..它奏效了。感谢 NeronLeVelu。谢谢你们俩的帮助。
    • 实际上,这是两个不相关的问题: (a) 使用&gt;&gt; 只是意味着如果在调用awk 命令之前给定的输出文件已经存在,它将被附加 到; (b) 无论您使用&gt; 还是&gt;&gt;,在打开新文件时不明确关闭文件可能会使您用完具有大量输出文件的文件句柄。
    【解决方案3】:
    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}
    '
    

    【讨论】:

    • 感谢更新,但据我了解,您不需要明确截断文件 - 只需使用 print &gt; f 代替 print &gt;&gt; fawk 中的重定向运算符与 shell 的工作方式不同:在 awk 脚本中,在每次迭代中使用 &gt; 不会每次都重新创建文件;相反,它将在首次访问时隐式打开/截断文件,然后继续追加直到文件关闭(显式或隐式在 awk 终止时)。
    • @mklement0 sweet 不知道。我对 awk 很满意 :-)
    • @mklement0 当然可以,但是您能否详细说明一下未关闭的处理程序会发生什么?我的意思是当 awk 终止时它不会被关闭吗?
    • 是的,它们最终会被自动关闭,但是如果有大量输出文件,您可能会在脚本完成之前用完文件句柄。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多