连接文件并在文件之间插入新行

我有多个文件,我想连接到 cat。 这么说吧

File1.txt
foo


File2.txt
bar


File3.txt
qux

我想连接,使最后的文件看起来像:

foo


bar


qux

而不是通常的 cat File*.txt > finalfile.txt

foo
bar
qux

正确的做法是什么?

163603 次浏览

你可以这样做:

for f in *.txt; do (cat "${f}"; echo) >> finalfile.txt; done

在运行上述命令之前,请确保文件 finalfile.txt不存在。

如果你被允许使用 awk,你可以:

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

如果是我,我会用 sed:

sed -e '$s/$/\n/' -s *.txt > finalfile.txt

在这个 sed 模式中,$有两个含义,首先它只匹配最后一行的行号(作为应用模式的行的范围) ,其次它匹配替换模式中的行尾。

如果您的 sed 版本没有 -s(单独处理输入文件) ,那么您可以以循环的方式完成所有操作:

for f in *.txt ; do sed -e '$s/$/\n/' $f ; done > finalfile.txt

如果有足够的文件可以列出每个文件,那么可以在 Bash 中使用 工序替代工序替代,在每对文件之间插入一行新行:

cat File1.txt <(echo) File2.txt <(echo) File3.txt > finalfile.txt

这就是我在 OsX10.10.3中的做法

for f in *.txt; do (cat $f; echo '') >> fullData.txt; done

因为没有参数的简单‘ echo’命令最终没有插入新行。

这在 Bash 中是有效的:

for f in *.txt; do cat $f; echo; done

与使用 >>(附加)的答案不同,这个命令的输出可以通过管道传输到其他程序中。

例子:

  • for f in File*.txt; do cat $f; echo; done > finalfile.txt
  • (for ... done) > finalfile.txt(括号是可选的)
  • for ... done | less(管道变小)
  • for ... done | head -n -1(这样可以去掉后面的空白行)

在 python 中,这会在文件之间连接空行(,禁止添加额外的尾部空行) :

print '\n'.join(open(f).read() for f in filenames),

下面是可以从 shell 调用并将输出打印到文件中的难看的 python 一行程序:

python -c "from sys import argv; print '\n'.join(open(f).read() for f in argv[1:])," File*.txt > finalfile.txt

如果你喜欢,你可以用 xargs来做,但是主要思想还是一样的:

find *.txt | xargs -I{} sh -c "cat {}; echo ''" > finalfile.txt

您可以使用 grep-h来避免回显文件名

grep -h "" File*.txt

将给予:

foo
bar
qux