156

我有多个文件要与cat. 比方说

File1.txt 
foo

File2.txt
bar

File3.txt
qux

我想连接,以便最终文件看起来像:

foo

bar

qux

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

foo
bar 
qux

正确的方法是什么?

4

7 回答 7

154

你可以做:

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

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

如果您被允许使用awk,您可以执行以下操作:

awk 'FNR==1{print ""}1' *.txt > finalfile.txt
于 2011-11-18T13:36:17.880 回答
69

如果你有足够少的文件可以列出每个文件,那么你可以在 Bash 中使用进程替换,在每对文件之间插入一个换行符:

cat File1.txt <(echo) File2.txt <(echo) File3.txt > finalfile.txt
于 2014-05-08T18:32:10.327 回答
36

如果是我这样做,我会使用 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
于 2011-11-18T13:41:10.173 回答
11

这在 Bash 中有效:

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

与使用>>(append) 的答案相比,此命令的输出可以通过管道传输到其他程序中。

例子:

  • for f in File*.txt; do cat $f; echo; done > finalfile.txt
  • (for ... done) > finalfile.txt(括号是可选的)
  • for ... done | less(管道进入更少)
  • for ... done | head -n -1(这会去除尾随的空白行)
于 2016-11-10T19:56:40.933 回答
11

如果您愿意,可以使用它xargs,但主要思想仍然相同:

find *.txt | xargs -I{} sh -c "cat {}; echo ''" > finalfile.txt
于 2017-06-21T11:56:16.867 回答
8

这就是我刚刚在 OsX 10.10.3 上所做的

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

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

于 2015-08-13T14:22:22.807 回答
3

在 python 中,这与文件之间的空行连接(,抑制添加额外的尾随空行):

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

这是可以从 shell 调用并将输出打印到文件的丑陋的 python one-liner:

python -c "from sys import argv; print '\n'.join(open(f).read() for f in argv[1:])," File*.txt > finalfile.txt
于 2016-11-10T20:12:27.520 回答