如何基于Column1去重并结合Column3的条件处理CSV文件
处理大型CSV文件:按指定条件去重并清理数据
需求说明
需基于CSV文件的H1列(Column1)去除重复记录,同时满足以下条件:
H3列(Column3)可为空,或包含多个用:::分隔的值;- 若
H1存在重复值,保留H3中元素数量最多的那条记录; - 移除
H3列数字间的-符号。
输入示例
H1,H2,H3,H4 a,2,8005:::+2287:::3426,2 b,4,1111:::+15-00:::01354,1 b,4,1111:::+1500,1 c,4,2208:::+6583,9 d,5,7761:::+993733:::+53426,4 d,5,7761:::+993-733:::+53-426:::87425,4 d,5,7761:::53-426,4
期望输出
H1,H2,H3,H4 a,2,8005:::+2287:::3426,2 b,4,1111:::+1500:::01354,1 c,4,2208:::+6583,9 d,5,7761:::+993733:::+53426:::87425,4
当前脚本局限
现有脚本仅能完成基础去重和H3列的-符号清理,无法判断并保留H3元素数量最多的记录:
awk -F, '{ gsub(/-/,"", $3); print } ' input.csv > input_without_hyphen.csv awk -F',' -v OFS=',' '!a[$1]++' input_without_hyphen.csv > output.csv
解决方案
使用单遍扫描的awk脚本,整合所有逻辑,适合处理大型CSV文件:
awk -F',' -v OFS=',' ' NR == 1 { print; next } { # 清理H3列中的-符号 cleaned_h3 = $3 gsub(/-/, "", cleaned_h3) # 计算当前H3的元素数量 split(cleaned_h3, elements, /:::/) elem_count = length(elements) # 保留H1对应元素数最多的记录 if (!($1 in max_elem) || elem_count > max_elem[$1]) { max_elem[$1] = elem_count saved_records[$1] = $1 OFS $2 OFS cleaned_h3 OFS $4 } } END { # 输出所有保留的记录 for (key in saved_records) { print saved_records[key] } }' input.csv > output.csv
脚本逻辑说明
- 表头处理:
NR == 1 { print; next }直接输出表头,跳过后续处理 - 清理H3列:用
gsub移除cleaned_h3变量中的所有-符号 - 统计元素数量:通过
split按:::分割清理后的H3内容,用length(elements)获取元素总数 - 记录留存判断:用两个关联数组
max_elem存储每个H1对应的最大元素数,saved_records存储对应记录。若当前记录的元素数更大,则更新存储的记录 - 最终输出:在
END块遍历输出所有留存的记录
内容的提问来源于stack exchange,提问作者Rasec Malkic
相关产品推荐
相关产品推荐

