我有一堆由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
组合的结果,还有一个单独的文本文件,用于包含所有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...
命令,以便将输出连接(>>
)到一个文本文件(就像我已经在做的那样)并覆盖(>
)到另一个文本文件(就像我想做的那样)?
答案 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之间进行任何操作,那就是你的朋友。