cat是最直接可靠的选择,但需解决自然序排序、添加来源标记、统一编码、避免缓冲区溢出四大问题,否则合并结果不可信。

cat 是最直接、最可靠的选择,但“大”字意味着必须干预排序、加来源标记、防编码错乱——否则合并完的文件根本没法用。
用 cat 拼接时顺序总不对?先解决自然序问题
Shell 通配符(比如 *.log)默认按字典序展开:file10.txt 会排在 file2.txt 前面。日志、分片导出这类带数字编号的文件,一拼就乱。
- 临时验证:用
ls -v | xargs cat file1.txt file2.txt > merged.txt(-v支持自然排序) - 脚本中更稳:用
find . -name "data_*.csv" -print0 | sort -z | xargs -0 cat > merged.csv,-print0+sort -z避免空格和换行干扰 - 绝对别写
cat *.txt > all.txt——尤其当文件数超过几百个时,shell 参数限制可能直接报错Argument list too long
合并后不知道哪段来自哪个文件?必须加来源标识
cat 和 paste 都不记录来源,调试、审计、回溯时全靠猜。空行或文件名标记不是“锦上添花”,是刚需。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 加空行分隔:
awk 'FNR==1 && NR!=1{print ""} {print}' file1.txt file2.txt > merged.txt - 加文件名标记(推荐):
awk 'FNR==1{print "\n=== " FILENAME " ==="} 1' file1.txt file2.txt > merged.txt - 如果后续要进数据库或做统计,建议加全局行号:
awk '{print NR ": " $0}' file1.txt file2.txt > merged.txt
文件编码不一致导致乱码或截断?先统一再合并
UTF-8 带 BOM 的文件和纯 UTF-8 混合,cat 不报错但内容错位;GBK 和 UTF-8 混用,head 看着正常,grep 就找不到关键词。
- 先检查:
file -i file1.txt file2.txt看charset字段 - 统一转为 UTF-8(无 BOM):
iconv -f GBK -t UTF-8//IGNORE file1.txt | sed 's/^\xEF\xBB\xBF//' > file1_utf8.txt - 确认无二进制污染:
head -c 1000 file1.txt | LC_ALL=C strings | wc -l—— 如果远少于 1000,说明有大量不可见控制字符,得清洗
磁盘空间或内存快撑不住?避开管道缓存陷阱
cat file1 file2 | grep ... 这类管道看似省事,但大文件会把整个输出暂存在内存或临时缓冲区,容易触发 OOM 或卡死。真正“大”的文档(>500MB),应避免无意义的中间流。
- 优先写入磁盘再处理:
cat file1.txt file2.txt > merged.raw,再对merged.raw做sed/awk处理 - 追加模式比重定向更省资源:
cat file1.txt > merged.txt && cat file2.txt >> merged.txt,避免一次加载全部内容 - 如果只是去重且需保持原始顺序,用
awk '!seen[$0]++' file1.txt file2.txt > deduped.txt,它逐行读、逐行判重,内存占用恒定

















