我已经编写了 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 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