在stash中将stdout写入两个不同的文件(一个覆盖,一个追加)

时间:2014-07-31 19:37:27

标签: linux bash stdout tee

我有一堆由groupnumber组织的实验。我有3个不同的groupsnumber,我希望进行2个不同的实验。换句话说,我有以下实验要运行:

group A, 1
group A, 2
group B, 1
group B, 2
group C, 1
group C, 2

每次运行将实验结果打印到stdout的程序时,我都希望将这些结果放入文本文件中。我想要一个单独的文本文件用于每个groupnumber组合的结果,还有一个单独的文本文件,用于包含所有group个运行的每个number的结果。

所以,这是我的bash脚本运行所有这些实验:

#!/bin/bash

groups="A B C"
numbers="1 2"

rm *.txt

for g in $groups; do

    # Set the group settings based on the value of $g

    for n in $numbers; do

        # Set the number settings based on the value of $n

        ./myprogram >> $g-results.txt

    done

done

使用上面的代码,我最终得到了这些文本文件:

A-results.txt
B-results.txt
C-results.txt

但我也想要文本文件:

A-1-results.txt
A-2-results.txt
B-1-results.txt    
B-2-results.txt
C-1-results.txt
C-2-results.txt

如何更改./myprogram...命令,以便将输出连接(>>)到一个文本文件(就像我已经在做的那样)并覆盖(>)到另一个文本文件(就像我想做的那样)?

4 个答案:

答案 0 :(得分:3)

使用tee命令将标准输出“拆分”到多个目的地。

./myprogram | tee "$g-$number-results.txt" >> $g-results.txt

tee将其标准输入写入一个(或多个)命名文件以及标准输出,因此上述管道将每个myprogram实例的输出写入唯一的每次运行输出文件,以及将所有$g运行的输出聚合到一个文件。

您还可以聚合内部for循环的输出,而不是附加到文件。

for g in $groups; do
    # Set the group settings based on the value of $g
    for n in $numbers; do
        # Set the number settings based on the value of $n
        ./myprogram | tee "$g-$number-results.txt"
    done > "$g-results.txt"
done

答案 1 :(得分:2)

由于您已经列出了tee命令:

./myprogram | tee $g-$n-results.txt >> $g-results.txt

答案 2 :(得分:1)

作为一种简单的方式而不是:

./myprogram >> $g-results.txt

您可以捕获一次输出并将其写入两次:

$out=$(./myprogram)
echo "$out" >> "$g-results.txt"
echo "$out" > "$g-$n-results.txt"

答案 3 :(得分:1)

使用tee两次。

myprog | tee -a appendFile.txt | tee overwriteFile.txt

就像这样它也会打印到stdout。如果你愿意的话,你可以在末尾添加一些内容以将其传递给其他东西。

如果你需要在sed之间进行任何操作,那就是你的朋友。

相关问题