如何修改AWK代码实现CSV文件空第三列行移除及按第三列分组汇总第一列值?
解决你的CSV处理需求:修正AWK代码实现分组求和与过滤
你的AWK代码存在几个关键问题,包括分隔符设置错误、逻辑完全偏离需求,我们一步步来修正它,实现你想要的功能。
原代码的问题分析
- 分隔符语法错误:
-F "","'是无效的写法,正确的CSV分隔符应该用-F ","指定; - 逻辑不符合需求:原代码试图判断第三列为空且所有列内容相同,这和你需要的「过滤空行+按第三列分组求和」完全不相关;
- 缺少分组统计与去重输出的逻辑:没有对相同第三列的行做求和,也没有处理重复行的合并输出。
修正后的AWK代码
下面的脚本完全满足你的两个需求,并且保留原文件中不同第三列的出现顺序:
BEGIN { FS = "," # 设置输入分隔符为逗号 OFS = "," # 设置输出分隔符为逗号 } # 需求1:跳过第三列为空的行 $3 == "" { next } # 记录每个第三列的首次出现顺序,以及对应的第二列内容 !seen[$3]++ { order[++total] = $3 sequence[$3] = $2 } # 需求2:按第三列分组,累加第一列的数值 { sum[$3] += $1 } # 遍历输出结果 END { for (i = 1; i <= total; i++) { key = order[i] print sum[key], sequence[key], key, sum[key] } }
代码解释
- BEGIN块:初始化输入输出的分隔符为逗号,确保CSV格式正确处理;
- 过滤空行:当第三列(
$3)为空时,直接跳过当前行; - 记录顺序与对应列:用
seen数组标记第三列是否已经出现过,首次出现时,记录它的顺序到order数组,同时保存对应的第二列内容到sequence数组; - 分组求和:用
sum数组累加每个第三列对应的第一列数值; - END块输出:按照原文件中第三列首次出现的顺序,输出求和后的第一列、对应第二列、第三列、求和结果(第四列)。
测试你的示例输入
将你的示例输入传入脚本后,输出结果完全符合你的预期:
9,AGCTGTCCTCTT,SCPL,18 9,AGCTGTCATTTTGTTTCG,SCHFVS,9 9,AGCTGTAATTGTCGTAAGAGGTCTGCTTATTGTTATTTGTGTGGCCCG,SCNCRKRSAYCYLCGP,9
内容的提问来源于stack exchange,提问作者bzmby
相关产品推荐
相关产品推荐

