如何运行并行进程并在完成后合并输出

Ste*_*son 17 scripting parallelism

我有一个 bash shell 脚本,我在其中通过大约 5 或 6 个不同的程序传输一些数据,然后将最终结果放入制表符分隔的文件中。

然后我对一个单独的类似数据集再次执行相同的操作并输出到第二个文件。

然后将这两个文件输入另一个程序进行比较分析。例如简化

Data1 | this | that |theother | grep |sed | awk |whatever > Data1Res.csv
Data2 | this | that |theother | grep |sed | awk |whatever > Data2Res.csv
AnalysisProg -i Data1res.csv Data2res.csv
Run Code Online (Sandbox Code Playgroud)

我的问题是:如何使 step1 和 step2 同时运行(例如使用 &),但仅在两者都完成后才启动 step3(AnalysisProg)?

谢谢

ps AnalysisProg 不适用于流或 fifo。

cxw*_*cxw 28

使用wait. 例如:

Data1 ... > Data1Res.csv &
Data2 ... > Data2Res.csv &
wait
AnalysisProg
Run Code Online (Sandbox Code Playgroud)

将要:

  • 将 Data1 和 Data2 管道作为后台作业运行
  • 等待他们两个完成
  • 运行 AnalysisProg。

参见,例如,这个问题


Ole*_*nge 12

如果您只有 2 个文件,cxw 的答案无疑是更可取的解决方案。如果这 2 个文件只是示例,而您实际上有 10000 个文件,那么“&”解决方案将不起作用,因为这会使您的服务器过载。为此,您需要一个像 GNU Parallel 这样的工具:

ls Data* | parallel 'cat {} | this | that |theother | grep |sed | awk |whatever > {}res.csv
AnalysisProg -i *res.csv
Run Code Online (Sandbox Code Playgroud)

要了解有关 GNU Parallel 的更多信息: