我在使用cat
命令连接文件时遇到了一个奇怪的问题。我有两个文件,每个文件都有一个字符串:
文件 1:
ABC
Run Code Online (Sandbox Code Playgroud)
文件2:
DEF
Run Code Online (Sandbox Code Playgroud)
要么我做,cat file1 file2
要么我做cat file1 >> file2
。我希望输出如下所示:
ABC
DEF
Run Code Online (Sandbox Code Playgroud)
但是,我有这样一个有趣的输出:
ABCDEF
Run Code Online (Sandbox Code Playgroud)
我检查了文件,没有多余的空格或字符。但是,当我从字符串的后面手动删除时,我什至看不到一个字符。它工作正常。我想一定有某种我看不到的“隐藏”字符或线条。
它一直困扰着我,因为我有大量的文件要连接。我不能手动做同样的事情。
任何帮助表示赞赏。
paste
可能是您处理这个问题的最简单(更不用说非常有效)的方法。
printf abc >file1
printf def >file2
paste -sd\\n file[12]
Run Code Online (Sandbox Code Playgroud)
abc
def
Run Code Online (Sandbox Code Playgroud)
当paste
被-s
erial调用时,它将依次读取每个命名的输入文件以及paste
每个文件中 <tab> 或指定的-d
分隔符字符串中每一行的输出。虽然paste
总是以\n
ewline结束每个命名 infile 的输出,但这里的-d
elimiter 也被指定为\n
ewline,因此它基本上只是将cat
其输入输出到输出,但每个文件总是以\n
ewline 结尾。
正如 Peter 在下面指出的那样,一个空文件可能会导致paste
发出额外的\n
ewline。如果这是一个问题,实际上可以应用相同的方法,sed
但不会这样做:
abc
def
Run Code Online (Sandbox Code Playgroud)
abc
def
Run Code Online (Sandbox Code Playgroud)
但是,现在使用这种方法(sed
至少使用 GNU )可能会出现不同的问题。任何sed
将永远写出来\n
的另一条线拉前ewline,但如果它是很全的连续序列输入文件的最后一行,然后一些sed
小号(如GNU)可能无法在最后追加一个换行符。例如,对于我的输入文件,def后面没有换行符。
如果这是一个问题,那么......
: > file0
sed '' file[012]
Run Code Online (Sandbox Code Playgroud)
...上述管道应该涵盖您的所有基础。