合并文本文件列表(太长),在两者之间添加换行符

时间:2018-08-03 14:45:25

标签: bash unix text-files newline cat

我有一个包含〜300K文本文件的目录,我想将其连接成一个文件,并使用换行符\n将每个文件的内容分开。例如

file1 = 'i like apples'
file2 = 'john likes oranges'
output = 'i like apples\njohn likes oranges'

问题在于,由于文件数量众多,诸如

之类的命令
awk '{print}' dir/* combined.txt

关于参数列表过长引发错误。任何快速的方法来解决这个问题?我一直在尝试找到一种使用管道的方法,但到目前为止没有成功。

文本文件不以\n结尾。

3 个答案:

答案 0 :(得分:2)

要避免使用较长的命令行,可以使用诸如for循环之类的shell构造:

for f in dir/*; do cat "$f"; printf '\n'; done > combined.txt

如果合并文件中的文件顺序无关紧要,则可以改用find

find dir -type f -exec sed -s '$s/$/\n/' {} + > combined.txt

这使用find -exec来最大限度地减少-exec中的命令被调用的次数,同时避免了命令行太长。

sed -s '$s/$/\n'用换行符替换文件中最后一行的结尾; -s确保当多个参数作为参数提供时,更改将应用​​于每个文件。

答案 1 :(得分:0)

处理大量文件的一种好方法是使用find,这在当今大多数发行版中都是很标准的。某种东西:

find ./dir -type f -exec bash -c "cat \{\} >> combined.txt && echo '' >> combined.txt"\;

我没有对其进行测试,但这应该可以工作,并且具有从未构建包含dir

中所有文件的参数列表的优点。

答案 2 :(得分:0)

使用GNU并行解决方案:

printf '%s\0' * | parallel -0 'cat {}; echo' > combined.txt

次要错误:combined.txt将以\ n结尾(未指定)。

但是,我的猜测是,您将受到I / O的限制,因此Benjamin W.的解决方案可能会更快。