从MDK到VSCode:为STM32H743搭建一个高效双开发环境工程模板(含ARM Compiler V5/V6选择指南)
2026/4/1 19:13:09
Linux 中的join命令,这个命令的核心作用是按“关键字段”将多个文件的行关联合并(类似数据库的 JOIN 操作),区别于paste仅按行号无脑拼接,join会匹配两个文件中关键字段相同的行,再横向合并,是处理结构化文本(如 CSV、日志、数据清单)的核心工具。
资料合集:https://pan.quark.cn/s/6fe3007c3e95、https://pan.quark.cn/s/561de99256a5、https://pan.quark.cn/s/985f55b13d94、https://pan.quark.cn/s/d0fb20abd19a
使用join的硬性要求:
join[选项]文件1 文件2-作为文件参数,代表读取标准输入。join的选项围绕“关键字段、分隔符、匹配规则”设计,覆盖数据库 JOIN 的核心逻辑:
| 选项分类 | 选项 | 作用 | 实用场景 |
|---|---|---|---|
| 关键字段配置 | |||
-1 N | 指定文件1的第N列作为关键字 | 文件1关键字不在第一列时(如第3列是用户ID) | |
-2 N | 指定文件2的第N列作为关键字 | 文件2关键字不在第一列时 | |
| 分隔符配置 | |||
-t "字符" | 指定字段分隔符(默认空格/制表符) | 处理CSV文件(分隔符为逗号)、竖线分隔的文本 | |
-o 格式 | 自定义输出列(如1.1 2.2代表文件1第1列+文件2第2列) | 仅输出需要的列,避免冗余 | |
| 匹配规则(核心) | |||
-a 数字 | 显示指定文件的“不匹配行”(-a1=文件1所有行,-a2=文件2所有行) | 实现 LEFT/RIGHT JOIN 效果 | |
-v 数字 | 仅显示指定文件的“不匹配行”(-v1=仅文件1不匹配行) | 找两个文件的差异行 | |
-e "字符串" | 用指定字符串填充空列(配合-a使用) | 统一空值显示(如用“N/A”替代空) |
先准备两个已排序的结构化文件(模拟用户信息和订单信息):
# file1.txt(用户信息:ID 姓名 年龄,关键字=ID) 1 张三 25 2 李四 30 3 王五 28 4 赵六 35 # file2.txt(订单信息:ID 订单号 金额,关键字=ID) 1 OD001 100 2 OD002 200 3 OD003 150 5 OD005 300仅输出关键字(ID)在两个文件中都存在的行:
joinfile1.txt file2.txt输出结果(关键字+file1剩余列+file2剩余列):
1 张三 25 OD001 100 2 李四 30 OD002 200 3 王五 28 OD003 150用-a1保留文件1的所有行,无匹配时补空:
join-a1 file1.txt file2.txt输出结果:
1 张三 25 OD001 100 2 李四 30 OD002 200 3 王五 28 OD003 150 4 赵六 35组合-a1 -a2实现全连接,配合-e "N/A"填充空值:
join-a1 -a2 -e"N/A"file1.txt file2.txt输出结果:
1 张三 25 OD001 100 2 李四 30 OD002 200 3 王五 28 OD003 150 4 赵六 35 N/A N/A 5 N/A N/A OD005 300用-v1仅显示文件1独有的行,-v2仅显示文件2独有的行:
# 仅文件1独有的行(赵六)join-v1 file1.txt file2.txt# 输出:4 赵六 35# 仅文件2独有的行(ID5)join-v2 file1.txt file2.txt# 输出:5 OD005 300准备CSV文件(需先排序):
# user.csv(ID,姓名,城市) 1,张三,北京 2,李四,上海 3,王五,广州 # order.csv(订单号,用户ID,金额) OD001,1,100 OD002,2,200 OD003,3,150 OD005,5,300步骤1:先按关键字排序(order.csv的关键字是第2列,需先排序):
# 对order.csv按第2列(用户ID)排序,保存为sorted_order.csvsort-t","-k2order.csv>sorted_order.csv步骤2:指定分隔符+自定义关键字+自定义输出列:
# -t ",":分隔符为逗号# -1 1:file1(user.csv)关键字是第1列# -2 2:file2(sorted_order.csv)关键字是第2列# -o 1.2,1.3,2.1,2.3:输出列=姓名、城市、订单号、金额join-t","-11-22-o1.2,1.3,2.1,2.3 user.csv sorted_order.csv输出结果(CSV格式):
张三,北京,OD001,100 李四,上海,OD002,200 王五,广州,OD003,150将两个命令的输出按关键字合并(用-代表标准输入):
# 模拟生成已排序的用户ID+消费额,与file1.txt合并echo-e"1 500\n2 800\n3 600"|join-11-21file1.txt -输出结果:
1 张三 25 500 2 李四 30 800 3 王五 28 600join用相同的分隔符(如CSV用sort -t "," -k N);tr -s ' '压缩为单个空格;join会按笛卡尔积合并(如文件1ID1有2行,文件2ID1有3行,会生成6行);-e可自定义填充值(需配合-a使用才生效);paste/cat的核心区别(必分清)| 命令 | 合并逻辑 | 核心前提 | 适用场景 |
|---|---|---|---|
join | 按关键字段匹配合并(数据库JOIN) | 文件需按关键字排序 | 关联结构化数据(用户+订单、ID+信息) |
paste | 按行号无脑列拼接 | 无前提 | 简单列合并(姓名+年龄+职业) |
cat | 按顺序纵向行拼接 | 无前提 | 合并文件行(日志片段、文本片段) |
join是结构化文本的关联合并工具,核心价值是按关键字匹配行,日常高频用法:
join 文件1 文件2join -a1/-a2 -e "N/A" 文件1 文件2join -v1/-v2 文件1 文件2join -t "," -1 N -2 M 文件1 文件2join -o 1.X,2.Y 文件1 文件2