2011-03-27 78 views
13

我有一个非常基本的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 

我怎样才能做到这一点?

(请随意更改标题,如果你觉得有一个比较合适的一个)

+0

我今天需要的究竟是什么!谢谢! – shiri 2017-03-17 14:35:31

回答

14

echo工具的(GNU版本)有一个-n选项来省略尾随换行符。在你的第一个回声中使用它。为了可读性,您可能必须在第一行之后或第二行之前放置一些空格。

22

你可以通过-n选项,你的第一个echo命令,所以它不输出换行符。


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

echo "test : " ; echo "blah" 

将让你:

test : 
blah 

随着两个输出之间的换行符。


但是该用-n第一个echo

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

将得到以下的输出:

test : blah 

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

7

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

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

我想没有_correct_方法。 drysam的解决方案为我工作,他是第一个回答。感谢这个有趣的一行,但! :) – slhck 2011-03-27 14:11:18

+1

也许'正确'太强了,但是printf比echo -n更便于携带。 – 2011-03-27 14:41:59