Bash脚本优化:高效找出File1独有记录的方案
高效找出File1独有的记录(排除表头)
针对15万条级别的大文件,你原来的循环+grep方案效率极低的核心原因是:每次循环都启动一个grep进程,且重复读取File2,进程启动和重复IO的开销会被放大到十万级。以下是几个高效的替代方案:
方案1:用comm命令(最适合大文件,速度最快)
comm是Unix系统专门用于对比有序文件的工具,底层实现高效,适合处理十万级数据:
# 只输出File1中存在、File2中没有的行(已排除表头) comm -23 <(tail -n +2 File1 | sort) <(tail -n +2 File2 | sort) > output.txt
参数说明:
-23:屏蔽两个文件共有的行(-3)和File2独有的行(-2),仅保留File1独有的内容<():进程替换,直接将处理后的文件内容传递给comm,无需生成临时文件
方案2:用grep批量匹配(无需预排序)
利用grep的批量匹配参数,一次性完成对比,避免循环调用的开销:
grep -Fxvf <(tail -n +2 File2) <(tail -n +2 File1) > output.txt
参数说明:
-F:将匹配模式当作固定字符串(非正则),大幅提升匹配速度-x:要求整行完全匹配,避免部分内容匹配的误判-v:反向匹配,只输出不匹配的行-f:从处理后的File2中读取所有匹配模式
方案3:用awk(灵活适配复杂场景)
通过awk将File2的内容存入内存数组,遍历File1时直接做内存查询,仅需遍历两个文件各一次:
awk 'NR==FNR && NR>1 {arr[$0]=1; next} FNR>1 && !($0 in arr)' File2 File1 > output.txt
逻辑说明:
- 处理第一个输入文件(File2)时:跳过第一行表头,将每行内容存入数组
arr - 处理第二个输入文件(File1)时:跳过第一行表头,若当前行不在
arr中则输出
内容的提问来源于stack exchange,提问作者jgpadilla04
相关产品推荐
相关产品推荐

