Linux:合并多个文件,每个文件的内容在新行上

27

我正在使用cat *.txt将多个 txt 文件合并为一个文件,但我需要每个文件出现在一行上。

如何最好地合并文件,并使每个文件都出现在新的一行上?


8
不,它不会。尝试使用以下命令:echo -n a > a.txt; echo -n b > b.txt; cat a.txt b.txt - ephemient
@ephemient: echo "一些文本" > text.txt; file text.txt; echo -n "一些文本" > text.txt; file text.txt - Dennis Williamson
11
@Dennis Williamson: 那又怎样呢?关键是cat不会在文件之间添加任何换行符。如果一个文件以换行符结尾(就像大多数UNIX文本文件那样),那很好;如果没有,那就不会自动添加。 - ephemient
5个回答

40

只需使用awk

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

1
喜欢这个。我改编了它以生成注释,以便我可以知道新文件的每个部分来自哪个文件:awk 'FNR==1{ printf ("# %s\n", ARGV[ARGIND]) }1'。感谢您向我介绍awk。我正在合并.coffee文件,以便我可以避免使用coffee的--merge选项,从而获得一个可工作的源映射。 - Julian
4
建议修改如下,以避免在结果的顶部包含换行符:awk 'FNR==1&&NR!=1{print ""}1' *.txt - Scott Yang
我们可以在每个文件的末尾添加它吗?如果可以,我们可以添加两行新行而不是一行吗? - 4r7if3x

25

如果您有支持它的剪贴板

paste --delimiter=\\n --serial *.txt

做得非常好。


2
这是我测试过的文件连接的最快方法之一。好主意... - retrography
在我看来,这是最佳解决方案。-d-s 都是 POSIX 规定的,因此不应该有不支持它们的 paste。这个解决方案真的需要更多的投票支持。 - kralyk
+1 太棒了!非常感谢。这正是我想问的问题,答案也非常完美! - samsamara
2
哇塞,那速度真快!! - Michael Hall
1
为了避免参数列表过长的错误,请使用以下命令:echo * | xargs paste -s -d \n > foo.txt - Joshua Robinson
在MacOS的bash上,上面的主要答案不起作用,但是paste -d=\\n -s *.chunk.txt > all.txt可以。 - Per Quested Aronsson

17

您可以使用for循环遍历每个文件:

for filename in *.txt; do
    # each time through the loop, ${filename} will hold the name
    # of the next *.txt file.  You can then arbitrarily process
    # each file
    cat "${filename}"
    echo

# You can add redirection after the done (which ends the
# for loop).  Any output within the for loop will be sent to
# the redirection specified here
done > output_file

1
这将无法处理文件名中包含空格的文件。 - Ignacio Vazquez-Abrams
@IgnacioVazquezAbrams - 谢谢你的提醒(我在我的名字中不使用空格,所以通常会忘记这一点)。无论如何,我已经更新了我的示例来正确处理这个问题。 - R Samuel Klatchko
我选择了awk的解决方案,但这对其他脚本肯定会有用。谢谢。 - Marco
最佳的安全可扩展解决方案 - Bruno

7
for file in *.txt
do
  cat "$file"
  echo
done > newfile

7
我假设您想在文件之间插入换行符。
for file in *.txt
do
   cat "$file" >> result
   echo >> result
done

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