web-dev-qa-db-ja.com

2つのコマンドの出力を1行に連結する

ここに非常に基本的なシェルスクリプトがあります。

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値を計算し、fileqp、およびiの組み合わせごとに詳細な要約をファイルに書き込みます。それはいいです。

2>>本当に必要な1行の情報を出力します。しかし、実行すると、次のようになります。

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

どうすればそれを達成できますか?

(より適切なものがあると思われる場合は、タイトルを自由に変更してください)

17
slhck

(GNUバージョンの)echoユーティリティには、末尾の改行を省略する-nオプションがあります。最初のエコーでそれを使用します。おそらく、読みやすくするために、最初の行の後または2行目の前にスペースを入れる必要があります。

16
drysdam

-n最初のechoコマンドのオプションなので、改行は出力されません。


簡単なデモとして、これは:

echo "test : " ; echo "blah"

あなたを取得します:

test : 
blah

2つの出力の間に改行を挿入します。


これを-n最初のecho

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

次の出力が得られます:

test : blah

2つの出力の間に改行なし。

26
Pascal MARTIN

printfの代わりにechoを使用できます。これは 移植性の理由からより良い です。

9
kurumi

printfは問題を解決する正しい方法(+1くるみ)ですが、完全を期すために次のこともできます。

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