Ubuntu下如何提取两个文件的重复与唯一值并分别保存?
在Ubuntu中提取两个文件的重复值与唯一值
问题分析
你之前使用的命令中RS=""是错误的关键——这个选项会让awk将整个文件内容当作单个记录处理,而非默认的每行一个记录,导致匹配逻辑完全失效,因此输出了全部内容。
正确实现方法
1. 提取两个文件的重复值(同时存在于file1和file2)
执行以下命令,结果会保存到duplicates.txt:
awk 'NR==FNR{a[$0]; next} $0 in a' file1.txt file2.txt > duplicates.txt
- 逻辑说明:
NR==FNR:仅在处理第一个文件(file1.txt)时执行此块,将每行内容存入数组anext:跳过后续逻辑,直接处理下一行$0 in a:处理第二个文件(file2.txt)时,检查当前行是否在数组a中(即是否存在于file1),满足则输出
2. 提取file2中独有的唯一值(仅存在于file2,不在file1)
执行以下命令,结果保存到unique.txt:
awk 'NR==FNR{a[$0]; next} !($0 in a)' file1.txt file2.txt > unique.txt
- 逻辑说明:和上面的命令类似,仅将判断条件改为
!($0 in a),即输出file2中不存在于file1的行
3. 提取两个文件中所有仅出现一次的内容(通用场景)
如果需要提取两个文件里总共只出现过一次的内容(比如file1有独有的行,file2有独有的行,都纳入结果),用这个命令:
awk '{a[$0]++} END{for(k in a) if(a[k]==1) print k}' file1.txt file2.txt > all_unique.txt
- 逻辑说明:
a[$0]++:遍历所有行,统计每行出现的次数END块:所有行处理完成后,遍历数组a,输出出现次数为1的行
验证结果
按照你的示例文件执行上述命令后:
duplicates.txt内容:
abc 123 321
unique.txt内容:
456
内容的提问来源于stack exchange,提问作者Jonibek
相关产品推荐
相关产品推荐

