cat最直接但需防顺序错、编码混、无分隔;应显式列文件或用ls -v排序,先file -i查编码再iconv统一,加awk插入文件标记提升可读性。

cat 是最直接的命令,但能不能直接用它,取决于你到底要“拼起来”还是“对上号”——选错工具,合并结果可能完全不可用。
用 cat 拼接:顺序堆叠,不校验内容
适合日志归档、SQL脚本合并、配置片段叠加这类“只要内容连在一起就行”的场景。
- 基础写法:
cat file1.txt file2.txt > merged.txt,顺序即你写的参数顺序 - 别写
cat *.txt > all.txt——shell 展开通配符按字典序,file10.txt一定排在file2.txt前面;要用自然序就写:ls -v | xargs cat *.txt > merged.txt - 合并后没分隔?后续 grep 或 awk 很难定位来源——加
awk 'FNR==1{print "\n=== " FILENAME " ==="} 1' file1.txt file2.txt > merged.txt -
cat不处理编码,混入 GBK 和 UTF-8 文件会导致grep报Invalid byte sequence;先用file -i *.txt查编码,再统一转:iconv -f gbk -t utf-8 file_gbk.txt | cat - file2.txt > merged.txt
用 join 关联:按字段匹配,必须预排序
适合 users.txt(用户名+邮箱)和 orders.txt(用户名+订单号)这种有公共键、需横向关联的结构化数据。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 不排序直接跑
join file1.txt file2.txt行为未定义,大概率输出为空——必须先:sort file1.txt > s1.txt && sort file2.txt > s2.txt && join s1.txt s2.txt - 字段含空格或逗号?显式指定分隔符:
join -t ',' -1 1 -2 1 s1.csv s2.csv(-1 1 表示用 s1.csv 第一列当 key) - 想保留 file1 中没匹配上的行?加
-a 1;只输出 file2 中无匹配的?用-v 2 - 输出为空?检查三件事:
file -i看编码是否一致、head -n3看首尾空格、大小写是否严格相等(join -i可忽略大小写,但空格仍得手动清理)
用 paste 并排:逐行贴合,不丢行不排序
适合把 IP 列和响应时间列合成一行,或者两个行数一致的纯文本做“肩并肩”对齐。
- 基础用法:
paste file1.txt file2.txt > paired.txt,默认用 Tab 分隔 - 换分隔符:
paste -d ',' file1.txt file2.txt > out.csv - 两文件行数不等?短的补空行,不会报错也不会跳行——但若你发现某几行“空了一整列”,大概率是行数真不一致
-
paste不检查编码、不识别 BOM、不处理二进制内容;混入非文本文件(比如 PDF 片段),输出直接乱码
容易被忽略的硬伤:合并后内容不可信
真正卡住人的从来不是“怎么执行命令”,而是合并完发现行数对不上、字段错位、grep 找不到关键词、Python 读取报 UnicodeDecodeError——这些问题几乎都来自三个盲区:
- 顺序错:编号文件没干预排序,
data_9.csv排在data_10.csv后面,时序全乱 - 编码混:一个 UTF-8-BOM,一个 GBK,
cat照单全收,后续工具集体罢工 - 边界丢:多个文件拼一起没标记,出问题时根本没法判断哪段数据来自哪个源文件

















