You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量处理文本号码:按规则替换指定位置后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

脚本说明

  1. process_num函数:
    • 先移除+1前缀,用占位符临时替换0x避免干扰数字统计
    • 提取所有数字字符,取最后4位执行递增计算
    • 从后往前遍历原字符串,精准替换最后4个有效数字,再还原0x并加回+1前缀
  2. 主逻辑:
    • 对第3、4列按;、,、~拆分多字段
    • 仅处理包含sip:或tel:的号码字段,调用process_num处理
    • 拼接处理后的字段并还原原分隔符,最后输出整行

内容的提问来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 11:36:15