2014-02-06 30 views
1

我有一個循環,在bash腳本中。它運行的程序默認在工作時輸出一個文本文件,如果沒有則輸出文件。我運行它很多次(> 500K),所以我想合併輸出文件,逐行。如果循環的一次迭代創建一個文件,我想要取出該文件的最後一行,將其附加到主輸出文件,然後刪除原始文件,這樣我就不會在一個目錄中產生1000個文件。我到目前爲止的循環是:如果循環輸出文件不爲空,則複製最後一行bash

oFile=/path/output/outputFile_ 
oFinal=/path/output.final 
for counter in {101..200} 
do 
    $programme $counter -out $oFile$counter 
    if [ -s $oFile$counter ] ## This returns TRUE if file isn't empty, right? 
    then 
     out=$(tail -1 $oFile$counter) 
     final=$out$oFile$counter 
     $final >> $oFinal 
    fi 
done 

但是,它不能正常工作,因爲它似乎不會返回所有我想要的文件。那麼有條件的錯誤呢?

+0

你可以澄清在你的if條件中使用$ program變量以及$ phenotype變量嗎?由於這兩個變量未設置,因此很難遵循邏輯。 –

+0

這一行:'$ final >> $ oFinal' ...應該是'echo $ final >> $ oFinal'? –

+0

'$ phenotype'應該可能是'$ counter'而不是 – Adaephon

回答

1

你可以巧妙並通過該方案,而不是一個「真正」的文件的過程替代:

oFinal=/path/output.final 
for counter in {101..200} 
do 
    $programme $counter -out >(tail -n 1) 
done > $oFinal 

$程序將把進程替換爲一個文件,所有寫入它的行會尾

測試處理:我的「節目」輸出2行如果給定的櫃檯甚至

$ cat programme 
#!/bin/bash 
if (($1 % 2 == 0)); then 
    { 
     echo ignore this line 
     echo $1 
    } > $2 
fi 
$ ./programme 101 /dev/stdout 
$ ./programme 102 /dev/stdout 
ignore this line 
102 

所以,這個循環應該只輸出偶數之間的數字101和200

$ for counter in {101..200}; do ./programme $counter >(tail -1); done 
102 
104 
[... snipped ...] 
198 
200 

成功。

相關問題