针对CSV中重复的Column1值,保留Column3、Column4最长值
处理重复Column1的CSV数据:保留最长Column3/Column4值
需求说明
针对存在重复值的CSV文件,需按以下规则处理:
- 以**HEADER1(Column1)**为分组依据
- 对每个分组,保留长度最长的HEADER3(Column3)和HEADER4(Column4)取值
- HEADER2(Column2)需与对应HEADER1保持一致(示例中同一HEADER1的HEADER2值相同)
原始CSV数据
HEADER1,HEADER2,HEADER3,HEADER4 ap3,799,226:::5731,address 1 afk,731,+636:::773:992,address 2 ppd,411,8542,address 6 ap3,799,226,address 1:::address 9 ap3,799,474:::226:::5731,address 1 ppd,411,774:::+8825-22,address 6
现有错误脚本及输出
错误AWK脚本
$ awk -F',' -v OFS=',' ' FNR==1 { print; next } { a[$0]=length($3) } END { for (i in a) print i,a[i] }' input.csv
错误输出
HEADER1,HEADER2,HEADER3,HEADER4 ,14,731,+636:::773:992,address 2 ,16,799,474:::226:::5731,address 1 ,10,799,226:::5731,address 1 ,33,799,226,address 1:::address 9 ,4d,411,8542,address 6 ,14,411,774:::+8825-22,address 6
错误原因:脚本逻辑完全偏离需求——用整行作为数组键,还错误追加了长度值,导致输出格式混乱,根本没实现分组保留最长值的逻辑。
正确解决方案
正确AWK脚本
awk -F',' -v OFS=',' ' FNR == 1 { print; next } { key = $1 # 更新最长Column3 if (! (key in col3_len) || length($3) > col3_len[key]) { col3_len[key] = length($3) col3_val[key] = $3 } # 更新最长Column4 if (! (key in col4_len) || length($4) > col4_len[key]) { col4_len[key] = length($4) col4_val[key] = $4 } # 保留Column2(同一key的Column2值默认一致,取首次即可) if (! (key in col2_val)) { col2_val[key] = $2 } } END { for (key in col2_val) { print key, col2_val[key], col3_val[key], col4_val[key] } } ' input.csv
脚本逻辑说明
- 首行直接输出表头,不参与处理
- 用
$1(Column1)作为分组唯一键,维护三个关联数组:col2_val:存储每个分组对应的Column2值col3_val/col3_len:跟踪每个分组中长度最长的Column3值及其长度col4_val/col4_len:跟踪每个分组中长度最长的Column4值及其长度
- 遍历每行时,对比当前Column3/Column4的长度与已存储的最长值,更长则更新
- 最后遍历所有分组键,按CSV格式输出合并后的结果
期望输出
HEADER1,HEADER2,HEADER3,HEADER4 afk,731,+636:::773:992,address 2 ap3,799,474:::226:::5731,address 1:::address 9 ppd,411,774:::+8825-22,address 6
内容的提问来源于stack exchange,提问作者Rasec Malkic
相关产品推荐
相关产品推荐

