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



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

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

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

所以,下面是我的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...命令,使输出连接(>>)到一个文本文件(就像我已经做的)和覆盖(>)到另一个(就像我想做的)?

使用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

既然您已经列出了tee命令:

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

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

./myprogram >> $g-results.txt

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

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

使用两次tee

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

就像这样,它也会打印到stdout。如果你想的话,你可以在末尾添加一些内容,将其管道到其他内容。

如果您需要在两者之间进行任何操作,sed是您的朋友。

相关内容

最新更新