使用awk处理重复记录:将重复项第二列修改为唯一值
问题
需要用awk识别文件中的重复记录并直接修改原文件,文件包含6个无表头列,目标是修改重复记录的第二列,通过添加递增数字使其唯一。
原始数据
1 A B C D E 1 A B C D E (This is a duplicate record1) 1 A B C D E (This is a duplicate record2) 2 F G H I J 3 K L M N O
期望输出
1 A B C D E 1 A-1 B C D E 1 A-2 B C D E 2 F G H I J 3 K L M N O
补充说明
曾尝试Stack Overflow上的代码:awk 'cnt[$0]++{$0=$0" variant "cnt[$0]-1} 1' file,但数字被添加到了记录末尾,不符合需求。
解决方案
使用以下awk命令可实现需求,针对重复记录修改第二列而非追加到行尾:
awk '{ key = $0 if (cnt[key]++ > 0) { $2 = $2 "-" (cnt[key] - 1) printf "%s %-3s %s\n", $1, $2, substr($0, index($0, $3)) } else { printf "%s %-3s %s\n", $1, $2, substr($0, index($0, $3)) } }' file > temp && mv temp file
关键说明
- 重复判定:以整行内容作为统计键,确保只有完全重复的记录会被处理。
- 第二列修改:当记录重复时,给第二列追加
-N后缀,N从1开始递增(cnt[key]-1确保第一次重复时后缀为1)。 - 格式对齐:通过
printf的%-3s控制第二列宽度,保证和示例输出的对齐效果;substr($0, index($0,$3))保留第三列及之后的原始内容,避免破坏原有格式。 - 文件修改:awk无法直接编辑原文件,因此先将结果输出到临时文件,再覆盖原文件。
执行效果
运行命令后,原文件会被更新为期望格式,重复记录的第二列被添加唯一后缀,同时保持列对齐。
内容的提问来源于stack exchange,提问作者sam_alloy
相关产品推荐
相关产品推荐

