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


127

我有多个要合并的文件cat。比方说

File1.txt 
foo

File2.txt
bar

File3.txt
qux

我想要合并,使最终文件看起来像:

foo

bar

qux

代替平常 cat File*.txt > finalfile.txt

foo
bar 
qux

什么是正确的方法?


Answers:


120

你可以做:

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

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

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

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

10
AWK '{print $0}' *.txt
timger

7
这有一个明显的缺陷,即在结尾处(从第一个替代项开始)或在开头(第二个替代项)中都有空行。不过,您可以轻松地对此进行防范awk 'FNR==1 && NR > 1 ...'
三胞胎

5
如果放在>finalfile.txt后面,则done可以覆盖而不是追加,这将消除在循环之前确保文件丢失或为空的要求。
人间


35

如果是我这样做,我将使用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
或在GNU sed中:sed -s '$G' *.txt > finalfile.txt
Ruud Helderman

只有一条流!这应该是公认的答案!
Yassine ElBadaoui

小心,我只是因为我用find代替了而使计算机崩溃了*.txt,这意味着该文件已附加到其自身上!
Xerus

11

您可以根据需要使用它xargs,但是主要思想仍然相同:

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

1
谢谢。我发现xargs比使用bash中的循环更容易使用。
RawwrBag

9

这在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 (这会删除尾随的空白行)

7

这就是我在OsX 10.10.3上所做的事情

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

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


这会将字符串放在文件末尾;如何将其插入每个文件之间?
onassar

3

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

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

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

python -c "from sys import argv; print '\n'.join(open(f).read() for f in argv[1:])," File*.txt > finalfile.txt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.