如何使用awk通过分隔符和管道分割文件到另一个脚本?

时间:2015-01-25 05:42:28

标签: linux bash awk

我目前有一个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

但它不起作用。

1 个答案:

答案 0 :(得分: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