用cat拼接需干预排序防乱序,join需预排序且只输出匹配行,paste逐行并排不丢数据;三者均不自动标记来源,必须手动添加文件名或空行分隔以保障可追溯性。

直接用 cat 就行,但得看你要的是“拼起来”还是“对上号”——前者用 cat,后者得用 join 或 paste,混用会丢数据、出空行、结果不可读。
cat file1 file2 > merged:顺序拼接,但顺序可能不对
这是最常用也最容易翻车的操作。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 - 别写
cat *.txt > all.txt—— 编号乱、顺序错、后续分析全偏移
join file1 file2:按字段匹配合并,但必须先排序
join 不是拼文件,是查“谁和谁配得上”。它默认只输出两文件中第一列值完全相等的行,并横向拼成一行;不匹配的行直接丢弃,不是漏了,是设计如此。
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 必须提前排序:
sort file1.txt > s1.txt && sort file2.txt > s2.txt && join s1.txt s2.txt - 字段含空格?加
-t $'\t'或-t ','显式指定分隔符 - 想保留没匹配上的行?加
-a 1(保留 file1 中无匹配的)或-v 2(只输出 file2 中无匹配的) - 输出为空?先跑
file -i file1.txt file2.txt看编码,再head -n5 file1.txt file2.txt看字段是否真一致(首尾空格、大小写、BOM 都会导致不匹配)
paste file1 file2:逐行并排合并,不要求字段相同
适合把两个结构对齐的文件“肩并肩”贴在一起,比如把 IP 列和响应时间列合成一表。默认用 Tab 分隔,不排序、不校验、不丢行。
- 基础用法:
paste file1.txt file2.txt > paired.txt - 换分隔符:
paste -d ',' file1.txt file2.txt > out.csv - 行数不等?短文件末尾补空,不会报错也不会跳行;若想纵向堆叠(不是横向拼),改用
paste -s - 注意:
paste不处理编码、不检查二进制内容,混入非文本文件会导致输出乱码或截断
合并后内容不可信,往往因为没加来源标记
cat 和 paste 都不加任何分隔,join 更是连原始文件名都抹掉。调试、审计、回溯时根本分不清哪段来自哪个文件。
- 轻量空行分隔:
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 > numbered.txt - 真正要命的不是合不合并,而是合并完你不知道哪行是谁写的、从哪来的、有没有被截断——标记不是锦上添花,是底线










