如何基于两个含重复字符串的文件生成对比结果文件?
嘿,这个需求在日常文件处理里太常见了!我给你几个实用的方法,你可以根据自己需要的「指定内容」类型来选:
方法1:生成标准差异对比文件(最常用)
如果你想直观看到两个文件的所有差异(哪些行是A有B没有,哪些是B有A没有,哪些行内容不同),直接用diff命令就好:
# 生成基础差异文件 diff FILE1 FILE2 > comparison_result.txt # 生成更易读的「统一格式」差异(适合查看版本类变更) diff -u FILE1 FILE2 > comparison_result_unified.txt
输出文件里的符号含义:
<开头的行是FILE1独有的>开头的行是FILE2独有的---用来分隔两个文件的内容块
方法2:提取两个文件的「相同内容」
如果你的指定内容是两个文件里重复的部分,有两种简单方式:
方式A:用grep直接匹配整行
# 找出FILE1和FILE2中完全相同的整行,输出到common_lines.txt grep -Fxf FILE1 FILE2 > common_lines.txt
参数说明:-F按纯字符串匹配(不是正则),-x要求整行完全匹配,-f从FILE1读取要匹配的内容。
方式B:用comm命令(需先排序文件)
# 先排序两个文件(comm要求输入是有序的) sort FILE1 > FILE1_sorted sort FILE2 > FILE2_sorted # 提取共同行输出到common.txt comm -12 FILE1_sorted FILE2_sorted > common.txt
-12的意思是:不显示只在FILE1有的行(-1),也不显示只在FILE2有的行(-2),只留共同的。
方法3:提取某一个文件的「独有内容」
如果你要的是「只有FILE1有,FILE2没有」或者反过来的内容:
# 提取FILE1独有的行 grep -Fxvf FILE2 FILE1 > only_in_FILE1.txt # 提取FILE2独有的行 grep -Fxvf FILE1 FILE2 > only_in_FILE2.txt
方法4:自定义灵活对比(适合复杂需求)
如果你的「指定内容」不是整行,而是每行的某一部分(比如按冒号分隔的字段),或者要自定义输出格式,那awk是绝佳选择。比如写一个脚本compare.awk:
# 假设我们按冒号分隔字段,只对比第2个字段是否相同 BEGIN { FS=":" } { # 先把FILE1的内容存到数组里 if (FILENAME == ARGV[1]) { stored_fields[$2] = $0; # 存第2个字段对应的整行 } else { # 对比FILE2的第2个字段是否在FILE1里存在 if ($2 in stored_fields) { print "【共同字段】FILE1行:" stored_fields[$2] "\nFILE2行:" $0 >> "matched_result.txt" } else { print "【FILE2独有】" $0 >> "only_FILE2.txt" } } }
然后运行:
awk -f compare.awk FILE1 FILE2
这种方式可以完全按照你的需求定制对比逻辑和输出样式。
内容的提问来源于stack exchange,提问作者Ion Pop
相关产品推荐
相关产品推荐

