编写日期:2026-10-31。
适用场景
你手中有一张设备名称表,另有一张巡检状态表,两张表都使用设备编号,但行数和排列顺序不同。直接把第二张表贴到第一张表右侧,可能把显示器的状态写到采集器旁边。本教程使用 GNU Coreutils 的 join,按编号建立对应关系,生成名称、状态齐全的对照表,并明确显示哪些编号只有单边记录。
下面使用纯文本教学数据,不连接资产系统,也不修改原始业务表。适用于安装 GNU Coreutils 的常见 Linux 发行版。
原理:根据共同字段配对
join 寻找两份输入中相同的连接字段,再组合相应行。这里把第一列编号作为连接字段,逗号作为字段分隔符。输入必须按连接字段排序,而且排序和连接时使用一致的比较规则。GNU 官方手册说明了这些要求,不能通过忽略排序检查来弥补输入错误。GNU Coreutils 官方手册
默认连接只保留两边都有的编号。实际巡检往往还需要发现漏登记,因此后面会同时保留两边无法配对的行。另一个前提是编号唯一:如果同一编号在两边分别出现多次,会产生多种配对组合,结果行数可能突然增加。
准备工作
打开普通用户终端,在自己的工作目录操作。确认下面目录名尚未使用,再执行:
mkdir join-practice-20261031
cd join-practice-20261031
第一条命令失败时应停下,不要继续进入同名旧目录。本例文件名均为当前练习目录内的固定名称,不需要替换成系统路径。
本教程只处理每行两列、没有表头的简单逗号分隔文本。字段内部不能再包含逗号或换行;带引号、嵌入逗号的完整 CSV 文件应交给能够解析 CSV 的工具。
分步骤操作
第一步:建立顺序不同的两份输入
printf '%s\n' 'A03,标签机' 'A01,显示器' 'A02,采集器' > devices.txt
printf '%s\n' 'A04,待检' 'A01,正常' 'A03,维修' > states.txt
A01 等字符串只是教学用设备编号。devices.txt 的第二列是设备名称,states.txt 的第二列是巡检状态。特意让 A02 缺少状态,让 A04 缺少设备名称,方便观察单边记录。
第二步:检查编号是否重复
cut -d ',' -f 1 devices.txt | LC_ALL=C sort | uniq -d
cut -d ',' -f 1 states.txt | LC_ALL=C sort | uniq -d
两条命令都应没有输出。出现编号就先回到输入表,确认是重复录入还是确实存在一对多关系,不能直接删掉其中一行。这里先提取编号再排序,因此可以发现内容不同、编号相同的记录。uniq 只识别相邻重复项,前面的排序不能省略。GNU uniq 文档
第三步:按第一列排序
LC_ALL=C sort -t ',' -k 1,1 devices.txt > devices.sorted.txt
LC_ALL=C sort -t ',' -k 1,1 states.txt > states.sorted.txt
分隔符选项指定逗号,排序键限定为第一列。每条命令前的环境设置只影响该命令,使这里的 ASCII 编号使用一致的比较顺序。原始两份文件不会被排序结果覆盖。
第四步:生成完整对照表
if LC_ALL=C join --check-order -t ',' -a 1 -a 2 -e '未记录' -o '0,1.2,2.2' devices.sorted.txt states.sorted.txt > combined.pending.txt; then
mv combined.pending.txt combined.txt
else
printf '%s\n' '合并失败,请检查输入;不要使用临时结果。' >&2
fi
两个保留选项让第一份和第二份输入的单边记录都进入结果。输出字段依次为共同编号、第一份输入的第二列、第二份输入的第二列;缺失字段写为“未记录”。排序检查失败时,临时文件可能已经包含部分输出,所以只有成功后才将它改为正式结果名。GNU join 选项文档
验证方法
cat combined.txt
wc -l combined.txt
教学数据应得到四行:
A01,显示器,正常
A02,采集器,未记录
A03,标签机,维修
A04,未记录,待检
逐项核对 A01 的名称与状态来自不同输入,再检查 A02 和 A04 是否保留。四行意味着这里出现了四个不同编号,不代表所有资料已经完整。正式数据还应抽查首尾编号和缺失项,避免只看总行数。
常见错误
编号前后多出空格、字母大小写不一致,都会影响匹配。应先确认编号规范,再在输入副本中清理,不能凭感觉统一修改。若文件来自 Windows,行尾回车也可能混入字段,需要先核对文本格式。不要使用数字排序处理带前导零的编号;它们通常应作为完整字符串比较。也不要把表头混入普通数据后一起排序。
安全与回退
整个流程只读取输入并创建派生文件,不需要管理员权限。每次正式合并使用独立目录,避免重定向覆盖旧报告。结果有误时保留原表和错误信息,修正副本后重新生成即可;练习结束后通过文件管理器确认目录内容,再删除整个练习目录。
参考资料与转载说明
本文依据上述公开资料进行中文原创整理,不是逐句翻译,也不替代厂商手册。操作前请核对自己的版本、型号和备份。
评论一下?