Объединить вывод двух команд в одну строку

У меня есть очень простая оболочка script здесь:

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 и записывает подробное резюме в файл для каждой комбинации file, qp и i. Это прекрасно.

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

Как я могу это достичь?

(Пожалуйста, не стесняйтесь изменять заголовок, если вы считаете, что есть более подходящий)

Ответ 1

У утилиты echo (GNU version) есть опция -n, чтобы опустить конечную новую строку. Используйте это в своем первом эхом. Вероятно, вам придется разместить некоторое пространство после первой строки или до второго для удобства чтения.

Ответ 2

Вы можете передать параметр -n в свою первую команду echo, поэтому он не выводит новую строку.


В качестве быстрой демонстрации это:

echo "test : " ; echo "blah"

вы получите:

test : 
blah

С новой линией между двумя выходами.


Хотя это, с -n для первого echo:

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

вы получите следующий результат:

test : blah

Без новой строки между двумя выходами.

Ответ 3

printf - это правильный способ решить вашу проблему (+1 kurumi), но для полноты вы также можете:

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