代码之家  ›  专栏  ›  技术社区  ›  synaptik

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

  •  0
  • synaptik  · 技术社区  · 10 年前

    我有一堆实验是由 group number .我有三种不同的 groups 数字 ,我想做两个不同的实验。换句话说,我有以下实验要做:

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

    每次我运行一个将实验结果打印到stdout的程序时,我都希望将这些结果放入文本文件中。我想要一个单独的文本文件来显示每个结果 数字 组合,以及每个结果的单独文本文件 包含所有 数字 跑。

    下面是我运行所有这些实验的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 回复  |  直到 10 年前
        1
  •  3
  •   chepner    10 年前

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

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

    球座 将其标准输入写入一个(或多个)命名文件以及标准输出,因此上述管道将 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
    
        2
  •  2
  •   chrisaycock spacemanspiff    10 年前

    因为您已经列出了 tee 命令:

    ./myprogram | tee $g-$n-results.txt >> $g-results.txt
    
        3
  •  1
  •   anubhava    10 年前

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

    ./myprogram >> $g-results.txt
    

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

    $out=$(./myprogram)
    echo "$out" >> "$g-results.txt"
    echo "$out" > "$g-$n-results.txt"
    
        4
  •  1
  •   Threadicide    10 年前

    使用三通两次。

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

    就像这样,它也将打印到标准输出。如果你愿意的话,你可以在末尾添加一些东西,然后将其添加到其他地方。

    如果你需要在两者之间进行任何操纵,那么你的朋友就是你。