如何在使用“cat”命令连接文件时在它们之间包含空行?

20

我想在一个目录中列出所有文件,但是在每个文件之间加上一些空白。

5个回答

21

使用awk命令

awk 'FNR==1{print ""}{print}' file* > out.txt

恶劣的递归。但这个命令可以运行:awk 'FNR==1{print ""}{print}' *.txt > /tmp/out.txt - Matt
什么意思是“恶心的递归”? - ghostdog74
1
如果我单独运行那一行命令,它永远不会退出,并且不断将文件附加到out.txt中(该文件与我正在cat的文件位于同一个文件夹中)。Out.txt非常快速地变得非常大。(再次说明,OSX 10.5.8 YRMV)。 - Matt
在我的例子中,file* 表示处理以 file 开头的文件。因此如果你有像 file1、file2、file3 这样的文件名,它就会被处理。现在唯一的区别是你改为 *.txt。我猜想你可能有许多以 file 开头的文件?如果不是的话,我不明白为什么它会陷入递归而永远不会退出,因为这对我来说是有效的。无论如何,既然有了解决办法,那就应该没问题了。 - ghostdog74
2
awk 'FNR==1{}{print}' file* > out.txt 对我来说效果更好。谢谢。 - rahul286
显示剩余2条评论

13

尝试

find . -type f -exec cat {} \; -exec echo "-- spacer --" \;

显然,“spacer”可以不止是这里使用的简单示例。


可以运行,但我不能使用“\n”作为我的间隔符,它只会使用一个字面上的“\n”? - Matt
只需使用 echo "" 来输出空行。我应该说,间隔符可以比示例更多或更少。 - pavium
听起来你的实现和我的不同。echo '' 或者只有 echo 怎么样? - pavium
-printf "\n" 这个“操作”也是可行的;我相信它也避免了调用 echo 或任何其他子进程。 - Scott Stevens

2

您可能想看看pr(1),它可以直接实现您想要的功能。

如果你想自己制作,请展开这个基于posix的shell脚本片段:

ls -1  | while read f; do cat "$f"; echo This is a spacer line; done > /tmp/outputfile

这句话更易读为:
ls -1 | while read f; do
    cat "$f"
    echo This is a spacer line
done > /tmp/outputfile

对于 ls 命令,你实际上不需要使用 -1 参数。


谢谢!只要记得将输出重定向到另一个目录(如awk解决方案中所示)。 - Matt
你根本不需要用到 ls 命令。只需使用 for f in *; do cat ... 即可。 (http://porkmail.org/era/unix/award.html#ls) - Jacktose

-1

我认为最简单的方法是使用 paste 命令:

paste $(ls *) > file.out

嗯,不,这行不通。粘贴执行的是类似但与问题所要求的不同的操作。它会交错文件。 - Caleb

-2

echo "" > blank.txt
cat f1.txt blank.txt f2.txt blank.txt f3.txt

处理目录中的所有文件(假设使用ksh Shell)

for file in * ; do
   cat $file >> result.txt
   echo "" >> result.txt
done


这并不会处理目录中的所有文件,除非你手动将它们列为参数。 - Ian Gregory
如果你使用for循环展开所有内容,那么请小心。$file可能是一个目录,你会将一个目录作为文本文件来处理。 - ghostdog74

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接