为什么shell脚本输出文件被写成单行?

时间:2014-12-07 07:53:13

标签: bash shell

输入文件:带标题日期和预告片计数的ankit.txt

H2014-12-02
12ASDF23 FGHJ HJKL
123ASD23 FGHJ HJKL
123ASD23 FGHJ HJKL
123ASD23 FGHJ HJKL
T000004

我想要没有标题和预告片的数据。

命令:

head -n -1 ankit.txt | tail -n +2 >output
shell脚本中的

echo `head -n -1 ankit.txt | tail -n +2` >output

Iutput:

12ASDF23 FGHJ HJKL 123ASD23 FGHJ HJKL 123ASD23 FGHJ HJKL 123ASD23 FGHJ HJKL

输出单行...(我不想要

我尝试在shell脚本中简单地给出了cat命令,但显示的dadata也是单行

我在shell脚本中尝试了没有echo的相同命令。

即使我保留1个命令来通过shell脚本显示输出:

cat ankit.txt

输出是一行。 wc -l给出了正确的计数,但是一个简单的cp也提供了单行输出。

cp ankit.txt output

2 个答案:

答案 0 :(得分:4)

使用

echo `command`

不仅浪费,它还会在command的输出上执行空格拆分和全局扩展,然后再将其传递给echo。通常你只想要

command

或者如果您坚持要进行流程替换,并期望保留其输出,请将其放在双引号中:

echo "$(command)"

(另请注意,切换到现代推荐的流程替换语法。)

但实际上,你为什么要这样?如果你真的这样做,那还不是更好吗

echo "$(echo "$(echo "$(echo "$(echo ...

答案 1 :(得分:0)

看起来你已经获得了Windows行结尾。你有两个选择。预处理输入文件以获得UNIX结尾:

dos2unix ankit.txt

或者将其作为管道的一部分:

dos2unix < ankit.txt | head -n -1 | tail -n +2 > output

请注意dos2unix有两种模式。在第一种情况下,它将获取输入文件并使用UNIX行结尾重写它(这是预处理的理想选择)。在第二个中,它将从stdin读取并将新输出写入stdout(这是管道的理想选择)。