我在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
但是,它无法正常工作,因为它似乎无法返回我想要的所有文件。条件错误也是如此吗?
答案 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
成功。