我目前有一个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
但它不起作用。
答案 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