编写Awk脚本为指定列重复值添加自定义后缀(分两种场景)
解决方案:针对CR/DR场景的Awk后缀处理脚本
我会帮你分别实现两个场景的需求,核心是实现字母递增后缀生成逻辑(支持z之后自动转为aa、ab...),同时按第1列的CR/DR条件筛选处理。
通用字母序列生成函数
首先我们需要一个Awk函数,把数字转换成类似Excel列名的字母序列(1→a,26→z,27→aa,28→ab...),再拼接上CR/DR后缀:
function num2alpha(n, res, rem) { res = "" while (n > 0) { rem = (n - 1) % 26 res = sprintf("%c", rem + 97) res n = int((n - rem) / 26) } return res }
场景1:第1列为CR时,所有重复第3列添加递增后缀(从aCR开始)
需求回顾
仅当第1列为CR且第3列存在重复时,为每一行的第3列添加后缀,后缀从aCR开始递增,支持超过26条重复行(zCR之后自动转为aaCR、abCR...)
完整Awk脚本
awk -F"|" -v OFS="|" ' function num2alpha(n, res, rem) { res = "" while (n > 0) { rem = (n - 1) % 26 res = sprintf("%c", rem + 97) res n = int((n - rem) / 26) } return res } $1 == "CR" { count[$3]++ $3 = $3 num2alpha(count[$3]) "CR" } 1' input.txt
测试验证
输入示例:
a||c CR||2157237496 CR||2157237496 CR||2157237496 INV||2157237496 RNV||3457634589
输出示例:
a||c CR||2157237496aCR CR||2157237496bCR CR||2157237496cCR INV||2157237496 RNV||3457634589
逻辑说明
- 用
count[$3]数组跟踪每个第3列值在CR行中的出现次数 - 每次遇到CR行,递增计数后调用
num2alpha生成字母序列,拼接CR作为后缀 - 最后
1表示打印所有行(包括未处理的非CR行)
场景2:第1列为DR时,重复第3列除第一条外添加递增后缀(从aDR开始)
需求回顾
仅当第1列为DR且第3列存在重复时,第一条记录保持原第3列,从第二条开始添加后缀,后缀从aDR开始递增,支持超过26条重复行
完整Awk脚本
awk -F"|" -v OFS="|" ' function num2alpha(n, res, rem) { res = "" while (n > 0) { rem = (n - 1) % 26 res = sprintf("%c", rem + 97) res n = int((n - rem) / 26) } return res } $1 == "DR" { count[$3]++ if (count[$3] > 1) { $3 = $3 num2alpha(count[$3]-1) "DR" } } 1' input.txt
测试验证
输入示例:
a||c DR||3770022521 DR||3770022521 DR||3770022521 INV||9876543738
输出示例:
a||c DR||3770022521 DR||3770022521aDR DR||3770022521bDR INV||9876543738
逻辑说明
- 同样用
count[$3]跟踪DR行中第3列的出现次数 - 仅当计数>1时(即非第一条重复行)才添加后缀,这里
count[$3]-1是因为第一条计数为1,第二条开始从1对应aDR,以此类推 - 非DR行保持原样输出
内容的提问来源于stack exchange,提问作者as7951
相关产品推荐
相关产品推荐

