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

时间:2011-11-18 13:32:33

标签: linux unix cat

我有多个文件要与cat连接。 我们说

File1.txt 
foo

File2.txt
bar

File3.txt
qux

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

foo

bar

qux

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

foo
bar 
qux

这样做的正确方法是什么?

7 个答案:

答案 0 :(得分:90)

你可以这样做:

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

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

如果您被允许使用awk,您可以这样做:

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

答案 1 :(得分:36)

如果您有足够的文件可以列出每个文件,那么您可以在Bash中使用process substitution,在每对文件之间插入换行符:

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

答案 2 :(得分:31)

如果是我这样做,我会使用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

答案 3 :(得分:7)

这就是我在OsX 10.10.3上的表现。

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

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

答案 4 :(得分:7)

这适用于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(parens是可选的)
  • for ... done | less(管道更少)
  • for ... done | head -n -1(这会删除尾随空行)

答案 5 :(得分:6)

如果您愿意,可以使用xargs进行,但主要想法仍然是相同的:

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

答案 6 :(得分:2)

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

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

这是丑陋的python单行程序,可以从shell调用并将输出打印到文件中:

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