如何将文件放在一起,在某些文件的末尾添加缺少的换行符

HiT*_*uch 13 shell text-processing cat newlines

我有一堆.text文件,其中大部分以标准 nl 结尾。

一对夫妇最后没有任何终结者。最后一个物理字节(通常)是一个字母数字字符。

我正在使用cat *.text >| /tmp/joined.text,但随后注意到joined.text 中的几个地方,其中文件的第一行出现在前一个文件的最后一行的末尾。检查前一个文件,我看到没有行终止符——连接解释。

这就提出了一个问题,什么是最简单的连接方法,坚持缺少的换行符?这些选项呢?

  1. 一种可能有效地向某些输入文件添加空行的解决方案。对我来说,这不是问题,因为joined.text 的处理可以处理它。
  2. 仅将 cr/fl 添加到尚未以这种方式结束的文件的解决方案。

mur*_*uru 21

如果需要,可以添加换行符的另一个命令是awk,因此:

awk 1 ./*.txt
Run Code Online (Sandbox Code Playgroud)

这里的 1 是在 awk 中获得真条件的最简单方法,它适用于这个目的,因为真条件下的 awk 默认操作是打印输入行。

  • @Jon awk 对真条件的默认操作是打印输入行,“1”是最简单的真条件。它是 `awk '{print}'` 的简写 (4认同)

小智 5

这个方便的 Perl 单行代码可以完成添加缺少的换行符的工作(仅当该换行符尚未存在时):

perl -lpe '' ./*.text > output
Run Code Online (Sandbox Code Playgroud)


Sté*_*las 5

使用cutGNU 等一些实现cut,您可以执行以下操作:

cut -b 1- ./*.text > output
Run Code Online (Sandbox Code Playgroud)

因为如果缺少的话它将添加缺少的换行符。


Wad*_* M. 5

你可以使用这个:

grep -h "" ./*.txt
Run Code Online (Sandbox Code Playgroud)

-h 将删除文件名打印输出


ter*_*don 1

我想到的第一种方法是循环文件并仅打印其内容并附加换行符:

for f in *text; do
    printf '%s\n' "$(cat < "$f")"
done > /tmp/joined.text
Run Code Online (Sandbox Code Playgroud)

$()将删除任何已经存在的换行符,因此这将导致\n每个文件末尾只有一个换行符。