2014-02-06 44 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 

成功。

相关问题