You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 04:27:24