将两个命令的输出连接成一行

时间:2011-03-27 11:26:48

标签: bash shell concatenation

我在这里有一个非常基本的shell脚本:

for file in Alt_moabit Book_arrival Door_flowers Leaving_laptop
do
    for qp in 10 12 15 19 22 25 32 39 45 60
    do
        for i in 0 1
        do
            echo "$file\t$qp\t$i" >> psnr.txt
            ./command > $file-$qp-psnr.txt 2>> psnr.txt
        done
    done
done

command计算一些PSNR值,并为fileqpi的每个组合的详细摘要写入文件。没关系。

2>>输出我真正需要的一行信息。但是当执行时,我得到:

Alt_moabit  10  0
total   47,8221 50,6329 50,1031
Alt_moabit  10  1
total   47,8408 49,9973 49,8197
Alt_moabit  12  0
total   47,0665 50,1457 49,6755
Alt_moabit  12  1
total   47,1193 49,4284 49,3476

然而,我想要的是:

Alt_moabit  10  0    total  47,8221 50,6329 50,1031
Alt_moabit  10  1    total  47,8408 49,9973 49,8197
Alt_moabit  12  0    total  47,0665 50,1457 49,6755
Alt_moabit  12  1    total  47,1193 49,4284 49,3476

我怎样才能做到这一点?

(如果您认为标题更合适,请随时更改标题)

4 个答案:

答案 0 :(得分:24)

您可以将 -n 选项传递给您的第一个echo命令,因此它不会输出换行符。


作为一个快速演示,这个:

echo "test : " ; echo "blah"

会得到你:

test : 
blah

两个输出之间有换行符。


虽然如此,第一个-n echo

echo -n "test : " ; echo "blah"

将为您提供以下输出:

test : blah

两个输出之间没有任何换行符。

答案 1 :(得分:15)

(GNU版本)echo实用程序有一个-n选项来省略尾随换行符。在你的第一个回声上使用它。为了便于阅读,您可能需要在第一行之后或第二行之前放置一些空格。

答案 2 :(得分:8)

您可以使用printf代替echobetter for portability reasons

答案 3 :(得分:7)

printf是解决问题的正确方法(+1 kurumi),但为了完整起见,您也可以这样做:

   echo "$file\t$qp\t$i $( ./command 2>&1 > $file-$qp-psnr.txt )" >> psnr.txt