如何用Linux命令基于两文件公共列删除file1.csv的对应行?
Unix系统下根据另一个CSV主键删除当前CSV匹配行的解决方案
需求说明
给定两个CSV文件file1.csv和file2.csv,以col1作为主键,需要删除file1.csv中所有col1值在file2.csv中存在的行,保留表头和未匹配的行。
实现方案
最简实现(无需临时文件,bash环境适用)
直接执行以下命令即可输出符合要求的结果:
(head -n 1 file1.csv && join -t, -v1 <(tail -n +2 file1.csv | sort -t, -k1,1) <(tail -n +2 file2.csv | sort -t, -k1,1))
如果需要将结果保存为新文件,在命令末尾追加重定向即可:
(head -n 1 file1.csv && join -t, -v1 <(tail -n +2 file1.csv | sort -t, -k1,1) <(tail -n +2 file2.csv | sort -t, -k1,1)) > output.csv
分步实现(方便调试)
如果需要分步处理排查问题,可以按以下步骤操作:
- 分别提取两个文件的内容跳过表头,按主键
col1排序后保存为临时文件
# 处理file1的数据行 tail -n +2 file1.csv | sort -t, -k1,1 > sorted_file1.tmp # 处理file2的数据行 tail -n +2 file2.csv | sort -t, -k1,1 > sorted_file2.tmp
- 输出表头+未匹配的行
head -n 1 file1.csv join -t, -v1 sorted_file1.tmp sorted_file2.tmp
- 清理临时文件
rm sorted_file1.tmp sorted_file2.tmp
参数说明
head -n 1 file1.csv:提取file1.csv的表头行,保留到最终输出tail -n +2:跳过文件第一行(表头),读取所有数据行sort -t, -k1,1:指定字段分隔符为逗号,仅对第一个字段(主键col1)排序,是join命令的前置要求join -t, -v1:指定字段分隔符为逗号,-v1参数表示仅输出第一个输入文件中未匹配到第二个文件的行,也就是我们需要保留的file1中主键不在file2里的行
内容的提问来源于stack exchange,提问作者Rajan Raju
相关产品推荐
相关产品推荐

