在Shell中异步执行命令

时间:2014-08-31 11:46:16

标签: shell asynchronous

我有一个csv文件。目前我的脚本正在做的是:

  1. 并行排序两个文件。
  2. 完成第1步后,我正在两个文件中剪切一列。
  3. 在第2步之后,我正在分析我从第2步获得的文件。
  4. 我想要做的是,第1步完成后我想转到下一行csv并执行该行的排序命令(根据步骤1提到要排序的2个文件)。这意味着当第1行在第2步时,第2行应该在步骤1上。我该怎么做?我需要某种数据流水线技术吗?

    很抱歉这个混乱。我现在正在做的伪代码:

      sort col1_row1 > sorted_col1_row1 &
      sort col2_row1 > sorted_col2_row1 &
    
      wait for sorts
    
      cat sorted_col1_row1 | cut -f1-3 > cut_sorted_col1_row1 &
      cat sorted_col2_row1 | cut -f1-3 > cut_sorted_col2_row1 &
    
      wait for cat
    
      diff cut_sorted_col1_row1 cut_sorted_col2_row1 > diff_row1
    

    当row1文件的排序结束时,我希望程序跳转到row2以执行cat和diff运行在row1文件上。

2 个答案:

答案 0 :(得分:0)

您的描述很难理解。这就是你想要的吗?

( sort file1 | cut ... > step2.out ) &
sort file2 > step3.out &
wait
diff step2.out step3.out

答案 1 :(得分:0)

从表面上看,你应该使用类似的东西:

for suffix in row1 row2
do
    for prefix in col1 col2
    do
        base=${prefix}_${suffix}
        (sort $base | tee sorted_$base | cut -f1-3 > cut_sorted_$base) &
    done
    wait
    diff cut_sorted_col[12]_$suffix > diff_${suffix}
done

我假设你需要sorted_col1_row1作为sort输出的文件。如果您不需要它们,请删除子命令的tee部分。

cut开始之前,没有理由将并行性分解为完成的排序。无论如何,sort命令很有意思;它必须先读取所有输入,然后才能生成任何输出,至少在其基本排序操作模式下。当它用于合并时,它可以在读取所有输入之前产生输出。