如何删除CSV文件中指定列组合存在重复值的行
处理CSV中指定列组合重复的行
输入数据
Field1;Field2;Field3;Field4;Field5 alpha;15;16;delta;delta alpha;15;15;delta;kappa alpha;15;15;delta;delta alpha;15;16;delta;kappa
需求说明
需要删除所有满足以下任一条件的行:
Field2+Field3的列组合在文件中重复出现Field4+Field5的列组合在文件中重复出现
最终只保留两个列组合都唯一的行。
解决方案(使用awk)
通过两次遍历CSV文件实现:第一次统计两个列组合的出现次数,第二次筛选出两个组合出现次数均为1的行。
脚本方式
创建一个filter.awk文件,内容如下:
BEGIN { FS = OFS = ";" } # 第一次遍历统计次数 NR == FNR { # 生成两个组合的键 key_pair1 = $2 FS $3 key_pair2 = $4 FS $5 # 计数 count_pair1[key_pair1]++ count_pair2[key_pair2]++ next } # 第二次遍历筛选符合条件的行 count_pair1[$2 FS $3] == 1 && count_pair2[$4 FS $5] == 1
运行命令:
awk -f filter.awk your_file.csv your_file.csv
单行命令方式
直接在终端执行:
awk 'BEGIN{FS=OFS=";"} NR==FNR{k1=$2FS$3;k2=$4FS$5;c1[k1]++;c2[k2]++;next} c1[$2FS$3]==1 && c2[$4FS$5]==1' your_file.csv your_file.csv
输出结果
Field1;Field2;Field3;Field4;Field5 alpha;15;16;delta;kappa
代码说明
FS = OFS = ";":设置输入和输出的分隔符为分号,适配目标CSV格式- 第一次遍历(
NR == FNR):仅统计两个列组合的出现次数,存入关联数组count_pair1和count_pair2 - 第二次遍历:只输出两个组合出现次数都为1的行,确保这两个组合在整个文件中唯一
内容的提问来源于stack exchange,提问作者TenEM
相关产品推荐
相关产品推荐

