我有三个单行文本文件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里有一行,但所有的空格都没了。有什么建议吗?
既然你已经把它们放在一个文件里了,那就用 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而删除的尾行进给加了回来。
我刚刚试了一下。
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