2014-08-31 125 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命令都很有趣。它必須先讀取其所有輸入,才能生成其任何輸出,至少在其基本分類操作模式下是如此。當它用於合併時,它可以在讀取所有輸入之前產生輸出。