2016-08-08 56 views
1

我正在嘗試編寫一個自動運行數據分析程序的腳本。數據分析需要一個文件,對其進行分析,並將所有輸出放到一個文件夾中。程序可以同時在兩個終端上運行(每個分析一個不同的主題文件)。我怎樣才能同時運行兩個bash腳本而不重複同一個動作?

我寫了一個可以自動完成所有輸入的腳本。但是,我只能讓我的腳本自動運行一個腳本。如果我跑我的腳本同時也將分析同一主題的兩倍(沒用)

目前,我的劇本是這樣的:

for name in `ls [file_directory]` 
do 

    [Data analysis commands] 

done 

如果在兩個終端運行它,它會從的頂部開始包含所有數據文件的目錄。這是一個問題,所以我試圖做重複檢查,但它們不是很有效。

我嘗試了與if命令的名稱比較(沒有工作,因爲除了一個輸出文件以外的所有輸出文件都是唯一的名稱,所以它會檢查目錄頂部的第一個outfput文件夾,並說名稱是即使輸出文件夾進一步向下具有相同的名稱)。它看起來像..

for name in `ls <file_directory>` 
do 
    for output in `ls <output directory>` 
    do 
      If [ name==output ] 
      then 
       echo "This file has already been analyzed." 
      else 
       <Data analyis commands> 
      fi 
    done 
done 

我認爲這是正確的方法,但顯然不是。我需要檢查所有的名字之前作出一些決定(而不是一個接一個這樣做)

然後我試着移動完整的數據文件與mv命令(沒有工作,因爲「名稱」在for語句存儲所有文件名,以便它在列表中向下,不管目前文件夾中的內容如何)。我記得讀過一些關於shell腳本不能「實時」處理的東西,所以這是行不通的。

我的想法一直在尋找某種修改到,如果語句,以便它所有的名稱檢查我做出一個決定之前(如何?)

也有我可能會丟失我的任何其他命令可能會嘗試嗎?

+0

爲什麼不*背景*每個不同的搜索過程?例如'(你的具體目錄cmd)&'去下一個?還有Gnu'parallel'。 –

+0

@ DavidC.Rankin:我希望在'OS X'上有'並行'本地存在的... ... –

+0

@I'L'I ** GNU並行**使用'brew install parallel'很容易安裝 - 並且不可或缺! –

回答

0

我經常使用的一種模式是使用split命令。

ls <file_directory> > file_list 
split -d -l 10 file_list file_list_part 

這將創建一個文件,如file_list_part00到file_list_partnn 然後,您可以養活這些文件名到你的腳本。

for file_part in `ls file_list_part*` 
do 
    for file_name in `cat file_part | tr '\n' ' '` 
    do 
    data_analysis_command file_name 
    done 
done 
0

作爲後續的評論,你永遠不可能用 「LS」安裝GNU並行homebrew

brew install parallel 

那麼你的命令變爲:

parallel analyse ::: *.dat 

它將使用與Mac中一樣多的CPU核心並行處理所有文件。您還可以添加:

parallel --dry-run analyse ::: *.dat 

讓它向您展示它將在沒有實際運行任何東西的情況下運行的命令。

您還可以在--eta(估計到達時間)中添加估計工時完成的估計值,如果要一次運行8個工作,則可以添加-j 8。當然,如果您特別想要求2個職位,請使用-j 2

您也可以有GNU並行只需通過ssh訪問權限將任務和數據簡單分配給任何其他機器。

相關問題