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

批量替换文件多行指定列内容为标准电话号码

提取并标准化文本中的电话号码

原始文件内容

$ cat test.txt
69|1074330570|1,sip:+121345633210x3Bverstat=TN-Validation-Passed|tel:+12134565534|0
69|1077822111|2,;tel:+2223120011~sip:+2223120051@vzpps.com;|sip:+13123120022@vzpps.com|0
69|1077988012|1,sip:+121510016070x3Bverstat=TN-Validation-Passed|tel:+136965339510x3Bnpd|0

目标输出格式

69|1074330570|2134563321|2134565534|0
69|1077822111|2223120011|3123120022|0
69|1077988012|2151001607|3696533951|0

处理规则

  • 每列都包含+,提取+后的数字部分
  • 若+后是11位数字,取后10位(剔除首位的1)
  • 同一列有多个号码时,只保留第一个

问题说明

你之前尝试的命令:

awk -F"|"  'BEGIN {FS="+"} {print substr($3,2,10)}' test.txt

没法正确处理第二行的内容,原因是它仅简单按+分割后截取子串,既没处理多号码场景,也没适配数字长度的提取规则。

解决方案

用下面的awk命令可以完美实现需求:

awk -F'|' '{
    # 提取第三列的目标号码
    match($3, /\+([0-9]{10,11})/, m3)
    num3 = length(m3[1]) == 11 ? substr(m3[1], 2) : m3[1]
    # 提取第四列的目标号码
    match($4, /\+([0-9]{10,11})/, m4)
    num4 = length(m4[1]) == 11 ? substr(m4[1], 2) : m4[1]
    # 按格式输出结果
    print $1 "|" $2 "|" num3 "|" num4 "|" $5
}' test.txt

命令详解

  1. -F'|':指定竖线|作为列分隔符,拆分每行内容
  2. match($列, /\+([0-9]{10,11})/, m):用正则匹配+后面的10或11位数字,匹配到的数字存入数组m的第一个元素
  3. 数字长度判断:如果匹配到的是11位数字,就截取从第2位开始的10位;如果是10位则直接使用
  4. 最后按目标格式拼接所有列并输出

内容的提问来源于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:10:22