组合文本文件列表(太长),在两者之间添加换行符
Combine list of text files (too long), adding newline separator in between
我有一个包含约 300K 个文本文件的目录,我想将这些文件连接成一个文件,使用换行符分隔每个文件的内容 \n
。例如
file1 = 'i like apples'
file2 = 'john likes oranges'
output = 'i like apples\njohn likes oranges'
问题是由于文件较多,命令如
awk '{print}' dir/* combined.txt
抛出关于参数列表太长的错误。有什么快速解决这个问题的方法吗?我一直在尝试找到一种使用管道的方法,但到目前为止一直没有成功。
文本文件不以 \n
结尾。
为避免命令行过长,您可以使用 shell 构造,例如 for 循环:
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
确保在提供多个文件作为参数时将更改应用于每个文件。
处理大量文件的一个好方法是使用 find
,这在当今大多数发行版中都是相当标准的。类似的东西:
find ./dir -type f -exec bash -c "cat \{\} >> combined.txt && echo '' >> combined.txt"\;
我没有测试过,但这应该可以,而且优点是永远不会构建包含 dir
中所有文件的参数列表
GNU 并行解决方案:
printf '%s[=10=]' * | parallel -0 'cat {}; echo' > combined.txt
小错误:combined.txt 将以未指定的 \n 结尾。
不过,我的猜测是您会受到 I/O 的限制,因此 Benjamin W. 的解决方案可能更快。
我有一个包含约 300K 个文本文件的目录,我想将这些文件连接成一个文件,使用换行符分隔每个文件的内容 \n
。例如
file1 = 'i like apples'
file2 = 'john likes oranges'
output = 'i like apples\njohn likes oranges'
问题是由于文件较多,命令如
awk '{print}' dir/* combined.txt
抛出关于参数列表太长的错误。有什么快速解决这个问题的方法吗?我一直在尝试找到一种使用管道的方法,但到目前为止一直没有成功。
文本文件不以 \n
结尾。
为避免命令行过长,您可以使用 shell 构造,例如 for 循环:
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
确保在提供多个文件作为参数时将更改应用于每个文件。
处理大量文件的一个好方法是使用 find
,这在当今大多数发行版中都是相当标准的。类似的东西:
find ./dir -type f -exec bash -c "cat \{\} >> combined.txt && echo '' >> combined.txt"\;
我没有测试过,但这应该可以,而且优点是永远不会构建包含 dir
GNU 并行解决方案:
printf '%s[=10=]' * | parallel -0 'cat {}; echo' > combined.txt
小错误:combined.txt 将以未指定的 \n 结尾。
不过,我的猜测是您会受到 I/O 的限制,因此 Benjamin W. 的解决方案可能更快。