Linux环境下查找不同长度文件共有唯一值的方法咨询
问题解答
comm方案有效性确认
你当前使用的comm -12 file1.sorted file2.sorted > comm_values.txt方案完全正确。
comm命令本身完全不限制两个输入文件的长度,它的唯一使用前提是两个输入文件均已按照当前系统的locale规则排序完成。只要你用到的file1.sorted、file2.sorted是通过sort命令得到的标准排序结果,就可以输出你预期的2、4、6、8的共有值,完全适配你的需求。
注意:如果输入文件未排序,comm会输出不符合预期的结果,排序可执行命令:sort 原文件名 > 排序后文件名
其他替代实现方案
方案1:awk实现(无需提前排序)
如果你不想额外做文件排序步骤,可以直接用awk实现交集计算,命令逻辑和你之前求差异的命令一脉相承:
awk 'FNR==NR {a[$0]++; next} a[$0]' file1 file2 > comm_values.txt
逻辑说明:先把第一个文件的所有行存入哈希表a,遍历第二个文件时,只要当前行在哈希表中存在就输出,不受两个文件长度差异的影响。
方案2:grep实现(适合小文件快速操作)
如果两个文件体积都不大,可以用grep快速筛选共有行:
grep -xFf file1 file2 > comm_values.txt
参数说明:
-x:要求整行完全匹配-F:将匹配内容视为固定字符串,避免特殊字符引发的正则匹配异常-f:从指定的file1中读取匹配规则
方案选择建议
- 如果两个文件已经完成排序,优先使用comm命令,运行速度最快,内存占用极低
- 如果文件未排序且体积较小,用awk或grep即可,省去排序步骤更高效
- 如果是超大规模文件,还是建议先排序再用comm,性能会远高于awk哈希表方案
内容的提问来源于stack exchange,提问作者machine_apprentice
相关产品推荐
相关产品推荐

