我有一个包含〜300K文本文件的目录,我想将其连接成一个文件,并使用换行符\n
将每个文件的内容分开。例如
file1 = 'i like apples'
file2 = 'john likes oranges'
output = 'i like apples\njohn likes oranges'
问题在于,由于文件数量众多,诸如
之类的命令awk '{print}' dir/* combined.txt
关于参数列表过长引发错误。任何快速的方法来解决这个问题?我一直在尝试找到一种使用管道的方法,但到目前为止没有成功。
文本文件不以\n
结尾。
答案 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.的解决方案可能会更快。