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

28

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

What I want, however, is this:

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

我该如何实现这个目标?(如果您认为有更合适的标题,请随意更改)
请注意保留HTML标签。

今天正是我需要的!谢谢! - shiri
6个回答

40
你可以在第一个echo命令中使用-n选项,这样它就不会输出换行符。

作为一个快速的演示:


echo "test : " ; echo "blah"

您将获得:

test : 
blah

在两个输出之间加一个换行符。


而这个,则为第一个echo使用了 -n 参数:

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

您将获得以下输出:

test : blah

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


20

(GNU版本的)echo实用程序有一个-n选项,用于省略尾随换行符。在第一个echo上使用它。你可能需要在第一行之后或第二行之前放一些空格以提高可读性。


11

您可以使用printf替代echo,因为从可移植性的角度来看这样做是更好的选择


9

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

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

我想没有“正确”的方法。 drysam的解决方案对我有用,而且他是第一个回答的人。虽然感谢这个有趣的一行代码! :) - slhck
1
也许“正确”这个词有点过于强烈,但是printf比echo -n更具可移植性。 - William Pursell

0

我也遇到了同样的问题。 为了定义我的问题,我有一个脚本,它使用echo函数,像这样:

echo -n "Some text here"
echo -n "Some text here"

我得到的输出是这样的:
-n Some text here
-n Some text here

我希望文本在同一行中,并且输出中也打印了-n选项。

注意:根据man页面,-n选项不会打印尾随的换行符。

我解决这个问题的方法是在脚本文件开头添加shebang,像这样。

#!/bin/bash
echo -n "Some text here"
echo -n "Some text here"

这将打印所需的输出,如下所示:

Some text here Some text here

希望这能帮到你!


0

如果你只是想将输出打印到控制台,那么echo -n可能会起作用,但如果你想将输出重定向到文件,则不会起作用。

如果你想将连接后的输出重定向到文件,可以使用以下命令:

echo "Str1: `echo "Str2"`" >> file

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接