2014-08-31 128 views
0

我有一个csv文件。目前我的脚本正在做的是:在Shell中异步执行命令

  1. 并行排序两个文件。
  2. 第1步完成后,我正在剪切这两个文件中的一列。
  3. 第2步之后,我DIFF-荷兰国际集团这是我从步得到的文件2.

我想要做的是,当下完成步骤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文件,我想程序在2行跳与猫和DIFF上ROW1文件运行的执行。

+0

“为[一个]行执行排序命令”是什么意思? – 2014-08-31 11:48:00

+0

csv文件在每个行路径中包含2个文件。在第1步中,我将并行排序两个文件(如第1行所述)。当我进入第2步时,我希望我的程序读取csv文件的下一行并对2个文件进行排序(在第2行中提到),同时对第1行进行第2步。 – blackmamba 2014-08-31 12:04:54

+0

那么,您可以运行第2步和3在后台使用'(cmd1; cmd2;)&'subshel​​l块。那是你要的吗? – pelle 2014-08-31 13:02:12

回答

0

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

(sort file1 | cut ... > step2.out) & 
sort file2 > step3.out & 
wait 
diff step2.out step3.out 
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命令都很有趣。它必须先读取其所有输入,才能生成其任何输出,至少在其基本分类操作模式下是如此。当它用于合并时,它可以在读取所有输入之前产生输出。