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

Linux 在bash中将stdout写入两个不同的文件(一个覆盖,一个附加),linux,bash,stdout,tee,Linux,Bash,Stdout,Tee,我有一系列的实验,它们是由小组和数字组织的。我有三个不同的组,对于number,我希望运行两个不同的实验。换句话说,我要进行以下实验: group A, 1 group A, 2 group B, 1 group B, 2 group C, 1 group C, 2 每次我运行一个将实验结果打印到标准输出的程序时,我都希望这些结果被放入一个文本文件中。我希望为每个组和编号组合的结果创建一个单独的文本文件,并且为每个组的结果创建一个单独的文本文件,其中包含所有编号运行 下面是我运行所有这些实验的

我有一系列的实验,它们是由
小组
数字
组织的。我有三个不同的
,对于
number
,我希望运行两个不同的实验。换句话说,我要进行以下实验:

group A, 1
group A, 2
group B, 1
group B, 2
group C, 1
group C, 2
每次我运行一个将实验结果打印到标准输出的程序时,我都希望这些结果被放入一个文本文件中。我希望为每个
编号
组合的结果创建一个单独的文本文件,并且为每个
的结果创建一个单独的文本文件,其中包含所有
编号
运行

下面是我运行所有这些实验的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
但我也想要文本文件:

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…
命令,以便将输出连接(
>
)到一个文本文件(就像我已经在做的)并将(
)覆盖到另一个文本文件(就像我想做的)?

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

./myprogram >> $g-results.txt
您可以捕获一次输出并写入两次:

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

使用
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
使用发球台两次

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

就像这样,它也会打印到标准输出。如果你想的话,你可以在末端添加一些东西,将其连接到其他东西上


如果您需要执行任何操作,sed是您的朋友。

谢谢,但我需要在运行时扫描和监视文本文件。(我没有提到这一点,但这是我的一个要求。)哦,好吧,在这种情况下,基于
tee
的答案可能对你更合适,我想。太好了!不知道循环聚合的
。我也不知道tee做了多次写入。是的,但我相信如果你想一个tee追加(-a),另一个覆盖,你需要这样做。