如何在Linux Bash环境下合并两个表并仅保留两边匹配的值
两个文本表取共同匹配值的Bash实现方法
假设两张表分别存储为table1.txt和table2.txt,每行仅存一个字符串,可通过以下几种常用方案实现需求:
方案1:使用comm命令(性能最优,适合大文件)
comm是Linux专门用于对比两个有序文件内容的工具,默认输出三列内容:仅第一个文件存在的行、仅第二个文件存在的行、两个文件共有的行,通过参数过滤可直接提取交集:
comm -12 <(sort table1.txt) <(sort table2.txt)
参数说明:
-1:隐藏仅在第一个文件中存在的内容-2:隐藏仅在第二个文件中存在的内容<(sort 文件名)为进程替换语法,用于对未排序的输入文件先做排序,满足comm要求输入为有序内容的规则
方案2:使用awk命令(无需提前排序,灵活度高)
如果不想修改原文件排序,可通过awk遍历两个文件完成匹配:
awk 'NR == FNR { record[$0] = 1; next } record[$0] == 1' table1.txt table2.txt
逻辑说明:
- 先读取第一个文件
table1.txt,把每一行内容作为数组record的键,值设为1做标记 - 再读取第二个文件
table2.txt,如果当前行在record数组中有对应标记,就输出该行
方案3:使用grep命令(写法最简单,适合小文件)
grep -xFf table1.txt table2.txt
参数说明:
-x:要求整行完全匹配,避免部分字符串匹配导致的误判-F:把匹配模式当作普通固定字符串处理,不解析正则符号-f table1.txt:从table1.txt中读取所有需要匹配的模式
示例结果说明
你给出的预期输出中包含的AX-18001189仅在TABLE1中出现,未在TABLE2中匹配到,实际执行上述命令得到的正确交集结果为:
AX-18000257 AX-18000816 AX-18001524
如果确实需要输出该值,可根据业务需求自行调整匹配逻辑。
内容的提问来源于stack exchange,提问作者Paulo Alvarez
相关产品推荐
相关产品推荐

