如果循环中的输出文件不为空,则复制最后一行bash

时间:2014-02-06 15:08:09

标签: bash

我在bash脚本中有一个循环。它运行一个程序,默认情况下在工作时输出文本文件,如果没有,则不输出文件。我运行了很多次(> 500K)所以我想逐行合并输出文件。如果循环的一次迭代创建了一个文件,我想获取该文件的LAST行,将其附加到主输出文件,然后删除原始文件,这样我就不会在一个目录中找到1000个文件。我到目前为止的循环是:

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

但是,它无法正常工作,因为它似乎无法返回我想要的所有文件。条件错误也是如此吗?

1 个答案:

答案 0 :(得分:1)

您可以聪明地将程序替换为“真实”文件来传递程序:

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

$ program会将进程替换视为一个文件,写入它的所有行都将由tail处理

测试:如果给定的计数器是偶数

,我的“程序”输出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

成功。