合并多个文件时,在每个文件内容结束后添加新行

合并多个文件时,在每个文件内容结束后添加新行

我已经编写了 shell 脚本来合并不同文件的内容,我已经创建了目录 f1、f2、d1、d2 及其下的文件,我需要合并所有文件的内容:命令是

(find /home/ah5024331/f1 /home/ah5024331/f2  /home/ah5024331/d1  /home/ah5024331/d2 /home/ah5024331/f1 /home/ah5024331/f2  -type f | xargs -i cat {} ) > t.txt

输出为:

--this is new text from f1 ----
--this is text from f2 ------this is new text from d1 ------this is new text from d2 -----this is new text from f1 ----

我需要在每个文件结束后添加新行,例如:

--this is new text from f1 ----
--this is text from f2
------this is new text from d1 
------this is new text from d2 
-----this is new text from f1 ----

怎么做?

如能得到任何帮助,我们将不胜感激。

答案1

尝试这个:

#!/bin/bash
for f in $(find /home/ah5024331/f1 /home/ah5024331/f2 \
    /home/ah5024331/d1 /home/ah5024331/d2 -type f)
do
    cat "$f" >> t.txt
    echo >> t.txt
done

这会在每个文件结束后附加一个换行符,但是,如果这些文件中的任何一个在末尾已经有换行符,您将在输出中看到一个额外的空白行(如@mnmnc 在评论中提到的)。

答案2

创建一个带有换行符的虚拟文件。

echo -n "" > /tmp/newline.txt

现在按如下方式执行您的脚本。

(find /home/ah5024331/f1 /home/ah5024331/f2  /home/ah5024331/d1  /home/ah5024331/d2 /home/ah5024331/f1 /home/ah5024331/f2  -type f | xargs -i cat {} /tmp/newline.txt ) > t.txt

答案3

使用 GNU Parallel 它看起来像这样:

(find ...  -type f | parallel -j1 cat {}';'echo ) > t.txt

GNU Parallel 是一个通用的并行化器,可以很容易地在同一台机器或您有 ssh 访问权限的多台机器上并行运行作业。它还可以for像本例一样替换许多循环。

如果你想在 4 个 CPU 上运行 32 个不同的作业,那么并行化的直接方法是在每个 CPU 上运行 8 个作业:

简单调度

当一个进程完成时,GNU Parallel 会生成一个新进程 - 保持 CPU 活跃,从而节省时间:

GNU 并行调度

安装

如果您的发行版未包含 GNU Parallel,您可以进行个人安装,此操作无需 root 访问权限。只需 10 秒即可完成,操作如下:

(wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - http://pi.dk/3) | bash

对于其他安装选项,请参阅https://git.savannah.gnu.org/cgit/parallel.git/tree/README

了解更多

查看更多示例:https://www.gnu.org/software/parallel/man.html

观看介绍视频:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

完成教程:https://www.gnu.org/software/parallel/parallel_tutorial.html

注册电子邮件列表以获取支持:https://lists.gnu.org/mailman/listinfo/parallel

相关内容