【问题标题】:How to use awk to split files by separator and pipe into another script?如何使用 awk 通过分隔符分割文件并将其通过管道传输到另一个脚本中?
【发布时间】:2015-01-25 05:42:28
【问题描述】:

我目前有一个 gawk 程序可以满足我的需求:

gawk '{command = ("python gen.py")
    print $0 | command
    close(command)}' RS='*** END OF THE RECORD' bigfile.txt

基本上,我有一个包含几百条记录的大文件(想想 1 gb),每条记录都由以“*** END OF THE RECORD”开头的行分隔。每个记录块将有几兆字节大,例如 ~5mb。

我将文件分成小部分(由“***END OF THE RECORD”行分隔),并将其通过管道传输到 python 程序中以进行进一步处理。

我怎样才能在普通的 awk 中做到这一点,而不是 gawk?这个程序目前在 awk 中给我一个错误。

值得注意的是,该程序将每个小输出通过管道传输到另一个程序,因此单独输出每一行的解决方案将不起作用。我还需要使用 close(command) 关闭管道,以便为我管道的每个文件运行一个新脚本。

我尝试过这样的事情:

awk '/^*** END OF THE RECORD/{next}{command = ("python gen.py")
    print | command
    close(command)}' file.text

但它不起作用。

【问题讨论】:

    标签: linux bash awk


    【解决方案1】:

    这适用于我在 GNU awk --posix 下。替换:

    RS='*** END OF THE RECORD'
    

    与:

    RS='\\*\\*\\* END OF THE RECORD'
    

    或者,更好:

    RS='[*][*][*] END OF THE RECORD'
    

    问题在于RS 被视为正则表达式,而*** 是非法正则表达式。

    一个更简单的例子

    这个更简单的脚本会产生与我在您的较长脚本中看到的相同的错误:

    $ awk --posix '1' RS='*** END OF THE RECORD' file
    awk: fatal: Invalid preceding regular expression: /*** END OF THE RECORD/
    

    当星星被转义时,错误消失,代码运行以下任一:

    $ awk --posix '1' RS='\\*\\*\\* END OF THE RECORD' file
    $ awk --posix '1' RS='[*][*][*] END OF THE RECORD' file
    

    【讨论】:

      猜你喜欢
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      • 2016-09-20
      • 2011-12-20
      • 2016-02-26
      • 1970-01-01
      • 1970-01-01
      • 2017-02-09
      相关资源
      最近更新 更多