我有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:
优化的目的是在一些文件准备好处理之前摆脱等待直到awk完成。
答案 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
将产生一秒的输出。如果需要更长时间,请相应地调整睡眠。