如何快速对比两个key=value格式大文件的行并查找差异行?
解决方案
方法1:awk 单行命令(最高效,3万行数据毫秒级完成)
无需提前预处理文件,一行命令即可完成筛选:awk -F '=' 'NR==FNR {keys[$1]=1; next} !($1 in keys)' file1 file2
参数逻辑说明:
-F '='指定字段分隔符为等号,每行第一个字段即为keyNR==FNR {keys[$1]=1; next}处理第一个输入文件(file1)时,将所有key存入哈希表keys,处理完直接跳至下一行,不执行后续逻辑!($1 in keys)处理第二个输入文件(file2)时,只要当前行的key不在keys哈希表中,就输出整行内容
用你给出的示例文件测试,运行上述命令输出结果正好是D=5,完全匹配需求。
方法2:shell 工具组合替代方案
如果不熟悉awk语法,也可以用cut、grep组合实现,3万行规模下性能也完全够用:
# 提取file1的所有key存入临时列表 cut -d '=' -f1 file1 > file1_keys.txt # 过滤file2中key不在上述列表的行 grep -v -f <(sed 's/^/^/' file1_keys.txt | sed 's/$/=/') file2
逻辑说明:
- 提取file1所有key后,给每个key前后加匹配锚点:开头加
^、结尾加=,避免误匹配到value内容或者key的子串 - 用grep的
-v参数做反向匹配,输出的不匹配行就是目标结果
注意事项
- 两种方法都不要求两个文件提前排序,也不限制文件行序
- 默认以第一个等号前的内容作为key,如果你的key本身包含等号,需要调整分隔符匹配逻辑
内容的提问来源于stack exchange,提问作者mutatedzombie
相关产品推荐
相关产品推荐

