如何用awk去除同一字段中逗号分隔的重复条目?
解决逗号分隔字段的去重问题
你不需要先通过cut拆分文件,直接用awk就能一次性处理原文件file1,同时保留第一列并对第二列的逗号分隔内容去重:
awk -F'[ ,]' '{ printf "%s", $1 delete seen for(i=2; i<=NF; i++) { if(!seen[$i]++) { printf "%s%s", (i==2 ? " " : ","), $i } } print "" }' file1
原有代码无效的原因
- 错误地用
$1作为seen数组的判断键,循环中应该用当前遍历的$i来标记重复项 - FS变量设置方式错误:要么通过
-F参数传入,要么在BEGIN块中定义;直接处理原文件时,需要把分隔符设为空格或逗号(-F'[ ,]'),这样第一列是$1,后续每个逗号分隔元素都是独立字段 - 把
FS=","写在printf语句里完全无效,FS是awk内置变量,需要在合适的作用域定义
如果一定要基于已去掉第一列的file2处理,可用以下命令:
awk -F',' '{ delete seen for(i=1; i<=NF; i++) { if(!seen[$i]++) { printf "%s%s", (i==1 ? "" : ","), $i } } print "" }' file2
效果验证
针对你的示例输入:
file1内容:
data1 a,b,c,d,d,d,c,e
data2 a,b,b,c
执行第一个命令后输出:
data1 a,b,c,d,e
data2 a,b,c
完全符合期望结果。
内容的提问来源于stack exchange,提问作者quantumDog
相关产品推荐
相关产品推荐

