awk:输出到不同的进程

时间:2013-12-20 10:20:05

标签: bash awk

我有awk脚本,它根据某些条件将大文件分成几个文件。比我在每个文件上并行运行另一个脚本。

awk -f script.awk -v DEST_FOLDER=tmp input.file
find tmp/ -name "*.part" | xargs -P $ALLOWED_CPUS --replace --verbose /bin/bash -c "./process.sh {}"

问题是:有没有办法运行./process.sh:

  • 在第一个脚本完成之前,因为process.sh逐行处理文件(一行太长而无法直接传递给xargs);
  • 每个新文件都有一个标题(在script.awk中添加),应该在文件的其余部分之前运行;
  • 限制并行处理的数量;
  • GNU parallel,inotifywait不是一个选项;
  • 假设dest文件夹为空,文件名未知。

优化的目的是在一些文件准备好处理之前摆脱等待直到awk完成。

2 个答案:

答案 0 :(得分:1)

创建文件后,您可以将文件名传递给进程'或脚本的输入:

awk '{print name_of_created_file | "./process.sh &"}'

&process.sh发送到后台,以便它们可以并行运行。但是,这是gawk扩展而不是POSIX。查看manual

答案 1 :(得分:1)

你基本上自己给出答案:GNU Parallel + inotifywait可以工作。

由于您不允许使用inotifywait,您可以替代inotifywait。如果允许您编写自己的脚本,也可以运行GNU Parallel(因为这只是一个脚本)。

这样的事情:

awk -f script.awk -v DEST_FOLDER=tmp input.file &
sleep 1
record file sizes of files in tmp
while tmp is not empty do
  for files in tmp:
    if file size is unchanged: print file
    record new file size
  sleep 1
done | parallel 'process {}; rm {}'

假设awk将产生一秒的输出。如果需要更长时间,请相应地调整睡眠。