在Unix中把多个单行文本文件合并成一个单行文本文件。

问题描述 投票:0回答:2

我有三个单行文本文件foo1.txt、foo2.txt和foo3.txt。当我使用cat foo1.txt foo2.txt foo3.txt > foo.txt后,foo.txt包含了三行文字,我不希望这样,我希望从每个文件中加入一行文字。我试过 cat foo.txt | sed 's/\n//g' > new.txt但new.txt和foo.txt是一样的。我试过 tr '\n' '' < foo.txt > new.txt,同样的,new.txt和foo.txt是一样的。我试过 paste -sd "\0" foo1.txt foo2.txt foo3.txt > foo.txt但foo.txt仍然有三行。我试过 echo $(cat foo1.txt foo2.txt foo3.txt) > foo.txt虽说foo.txt里有一行,但所有的空格都没了。有什么建议吗?

unix
2个回答
1
投票

既然你已经把它们放在一个文件里了,那就用 tr 你要找的是 tr -d '\n'

$ cat foo.txt
1 1 11 1    1
1 1 11 1 122
1 1 1     1 1 133
$tr -d '\n' < foo.txt > new.txt
$ cat new.txt
1 1 11 1    11 1 11 1 1221 1 1     1 1 133$

但请注意,这也会删除文件的最后一行进位。

awk 'ORS="";1' 会从单个文件中删除,但也会删除后面的换行,因为它将输出记录的分隔符设置为空,然后打印它所读取的每一行,如

$ cat 1.txt 2.txt 3.txt
1 1 11 1    1
1 1 11 1 122
1 1 1     1 1 133
$ awk 'ORS="";1' 1.txt 2.txt 3.txt
1 1 11 1    11 1 11 1 1221 1 1     1 1 133$

请注意,我的终端只是在结尾处有一个chiling。如果你想要一个尾部换行,你可以添加以下内容 END{print"\n"}例如

$ awk 'ORS="";1;END{print"\n"}' 1.txt 2.txt 3.txt
1 1 11 1    11 1 11 1 1221 1 1     1 1 133
$

如果你想在每个文件的行之间有一个空格之类的东西,你可以把ORS设置成什么什么,然后去掉1,不过这样一来,无论你设置成什么,都会留下一个尾部的字符,所以你必须在之后把它换回一个换行符,例如:。

$ awk 'ORS="|"' 1.txt 2.txt 3.txt | sed 's/|$/\n/g'
1 1 11 1    1|1 1 11 1 122|1 1 1     1 1 133

EDIT 在一个评论中,有人问awk命令到底是什么意思。

  • ORS=""; - 这将awk的输出记录分隔符设置为无,默认为"\n"。ORS在行之间使用,所以这将导致我们文件中的行被放入一行。

  • 1; - awk可以在代码块上工作,比如 condition? {code} 默认的行为是 print 如果不存在阻塞,所以这是一个简单的方法来写 {print}. 注意 ORS="" 也是块上的条件语句,不过在这种情况下,nothing的赋值被视为false,所以除了ORS被设置之外,什么都不会发生。 这就是为什么当我们把它改为类似于ORS="|" 我们可以去掉1,因为值ORS的赋值被看作是真,并且会执行默认的行为 {print}

  • END{print"\n"} - 以END为前缀的块只有在所有文件的所有行都被读取后才会被执行,所以这就把我们通过改变ORS而删除的尾行进给加了回来。


0
投票

我刚刚试了一下。

echo $(cat file1.txt file2.txt file3.txt)

这似乎可以去除文件输出之间的行尾.

关于你的空格消失了,我没有这种行为。

Prompt> cat test.txt
version = 1.203 
Prompt> echo $(cat test.txt test.txt test.txt)
version = 1.203 version = 1.203 version = 1.203
© www.soinside.com 2019 - 2024. All rights reserved.