如何批量处理文本号码:按规则替换指定位置后4位数字
需求与解决方案
需求说明
需要处理test.txt文件,对第3、4列中的号码执行数字递增替换(规则:0→1、1→2…9→0),具体规则如下:
- 排除号码的
+1前缀,仅对号码部分的最后4位有效数字进行替换 - 若遇到
0x序列,紧邻x的那个0不计入有效数字统计
原awk脚本仅适配纯数字列,无法处理包含其他字符的列,需修改脚本实现需求。
输入输出示例
输入(test.txt)
69|1074330570|1,sip:+121345633210x3Bverstat=TN-Validation-Passed|tel:+12134565534|0 69|1077822111|2,;tel:+12223120011~sip:+12223120051@vzpps.com;|sip:+13123120022@vzpps.com|0
期望输出
69|1074330570|1,sip:+121345644320x3Bverstat=TN-Validation-Passed|tel:+12134566645|0 69|1077822111|2,;tel:+12223121122~sip:+12223121162@vzpps.com;|sip:+13123121133@vzpps.com|0
原脚本问题
原脚本直接截取列的最后4位进行递增处理,完全没考虑列中存在非数字字符、+1前缀、0x特殊序列的情况,无法适配复杂格式的目标列。
原脚本代码:
awk -F"|" -v OFS="|" ' NR>0 { for (i=3;i<=4;i++) { str = substr($i, 1, length($i) - 4) for (j = length($i) - 3; j <= length($i); j++) { str = str (substr($i, j, 1) + 1) % 10 } $i = str } } 1'
修改后的awk脚本
awk -F"|" -v OFS="|" ' # 处理单个号码段:定位最后4位有效数字并执行递增替换 function process_num(s) { # 移除+1前缀 sub(/\+1/, "", s) # 用占位符替换0x,避免干扰有效数字统计 gsub(/0x/, "\x01x", s) # 提取所有数字字符 digits = "" for (k=1; k<=length(s); k++) { c = substr(s, k, 1) if (c ~ /[0-9]/) { digits = digits c } } # 还原0x占位符 gsub(/\x01x/, "0x", s) # 处理最后4位数字的递增 if (length(digits) >=4) { target = substr(digits, length(digits)-3) new_target = "" for (m=1; m<=4; m++) { d = substr(target, m, 1) new_target = new_target (d+1)%10 } # 从后往前替换原字符串中的最后4个有效数字 cnt = 0 new_s = "" for (k=length(s); k>=1; k--) { c = substr(s, k, 1) if (c ~ /[0-9]/ && cnt <4) { new_s = substr(new_target, 4-cnt, 1) new_s cnt++ } else { new_s = c new_s } } # 加回+1前缀 sub(/^/, "+1", new_s) return new_s } else { # 有效数字不足4位,直接返回原串(加回+1前缀) return "+1" s } } # 处理每一行的目标列 { for (i=3; i<=4; i++) { col = $i new_col = "" # 按分隔符拆分列中的多个字段 n = split(col, parts, /[,;~]/) for (p=1; p<=n; p++) { part = parts[p] # 仅处理包含sip:或tel:的号码字段 if (part ~ /(sip:|tel:)/) { if (match(part, /(sip:|tel:)(.*)/, arr)) { processed = process_num(arr[2]) new_col = new_col arr[1] processed } else { new_col = new_col part } } else { new_col = new_col part } # 还原原分隔符(最后一段不加) if (p <n) { new_col = new_col substr(col, index(col, parts[p])+length(parts[p]), 1) } } $i = new_col } print $0 } ' test.txt
脚本说明
process_num函数:- 先移除
+1前缀,用占位符临时替换0x避免干扰数字统计 - 提取所有数字字符,取最后4位执行递增计算
- 从后往前遍历原字符串,精准替换最后4个有效数字,再还原
0x并加回+1前缀
- 先移除
- 主逻辑:
- 对第3、4列按
;、,、~拆分多字段 - 仅处理包含
sip:或tel:的号码字段,调用process_num处理 - 拼接处理后的字段并还原原分隔符,最后输出整行
- 对第3、4列按
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

