我有一堆由group
和number
组织的实验。我有3个不同的groups
和number
,我希望运行2个不同的实验。换句话说,我要运行以下实验:
group A, 1
group A, 2
group B, 1
group B, 2
group C, 1
group C, 2
每次我运行一个将实验结果打印到stdout的程序时,我希望这些结果被放入一个文本文件中。我想要一个单独的文本文件用于每个group
和number
组合的结果,以及一个单独的文本文件用于包含所有number
运行的每个group
的结果。
#!/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是您的朋友。