bash - 合并文本文件列表(太长),在之间添加换行符分隔符

标签 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 结尾。

最佳答案

为了避免长命令行,您可以使用 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 确保在提供多个文件作为参数时将更改应用于每个文件。

关于bash - 合并文本文件列表(太长),在之间添加换行符分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51675127/

相关文章:

linux - 获取下周星期二和星期三,使用 Linux date 命令

c++ - 如何用文本文件中的另一个数字替换特定数字 (C++)

c# - .NET 为 Unix 系统(Icinga 或 Nagios)编写文本文件

c - 名为 'unix' 的变量的值为 1

c# - 从任意文本文件创建匿名类型对象

c# - 从文件中读取 double 值并将它们存储在数组中然后显示在列表框中

linux - 读取命令未从终端获取输入

linux - 根据另一个文件中的字符串拆分一个文件

bash - 使用 unix find 查找许多文件扩展名和名称的优雅方法

regex - 使用 sed 在特定行后添加换行符