终端批量处理CSV:移除CSV2中与CSV1 ID匹配的行
高效处理百万级CSV数据:筛选CSV2中独有的ID行
嘿,针对你这种百万级CSV数据的匹配需求,用终端命令绝对是最优解——Excel根本扛不住这么大的数据量。这里给你几个靠谱的方案,按效率和健壮性排序:
方案一:用awk快速处理(适合无特殊格式的CSV)
awk是处理文本数据的神器,速度极快,完全能hold住500万行的数据。核心思路是先把CSV1的ID存入内存数组,再遍历CSV2筛选出不在数组里的行。
命令(保留表头)
awk -F ',' 'NR==FNR {ids[$1]=1; next} FNR==1 || !ids[$1]' csv1.csv csv2.csv > result.csv
逐段解释:
-F ',':指定CSV的分隔符为逗号NR==FNR:当处理第一个文件(csv1.csv)时执行的逻辑,把每一行的ID作为数组ids的键,标记为1next:跳过后续逻辑,直接处理下一行,避免干扰第二个文件的处理FNR==1 || !ids[$1]:处理第二个文件(csv2.csv)时,要么是表头行(FNR==1)直接输出,要么当前行的ID不在ids数组里就输出- 最后把结果重定向到
result.csv
方案二:用join命令(需先排序,适合无特殊格式的CSV)
join命令专门用于关联两个文件,但要求输入文件按关联字段排序。对于百万级数据,排序的开销完全在终端的处理能力范围内。
命令(保留表头)
# 先保存CSV2的表头 head -n 1 csv2.csv > result.csv # 对两个文件按ID列排序 sort -t ',' -k 1,1 csv1.csv > sorted_csv1.csv sort -t ',' -k 1,1 csv2.csv | tail -n +2 > sorted_csv2_no_header.csv # 只输出CSV2中未匹配到CSV1的行,追加到结果文件 join -t ',' -v 2 sorted_csv1.csv sorted_csv2_no_header.csv >> result.csv # 可选:清理临时排序文件 rm sorted_csv1.csv sorted_csv2_no_header.csv
关键参数解释:
sort -t ',' -k 1,1:按逗号分隔,以第一列(ID)为关键字排序join -v 2:只输出第二个文件中没有匹配到第一个文件的行
方案三:用csvkit处理复杂CSV(支持带逗号的字段)
如果你的CSV里有带逗号的字段(比如Name列是"Smith, John"),上面的简单分隔符处理会出错。这时候可以用csvkit——专门处理CSV的工具集,能正确解析CSV语法。
步骤:
- 先安装csvkit(Ubuntu/Debian用
apt install csvkit,其他系统用pip install csvkit) - 执行命令:
csvjoin -c ID --left csv1.csv csv2.csv | csvsql --query "SELECT * FROM stdin WHERE csv1.ID IS NULL" > result.csv
解释:
csvjoin -c ID --left:以ID列为关键字,做左连接(CSV2的所有行都保留,匹配到CSV1的行会带上CSV1的字段)csvsql:用SQL语法筛选出CSV1的ID为空的行,也就是CSV2中独有的ID行
内容的提问来源于stack exchange,提问作者neo2049
相关产品推荐
相关产品推荐

