批量替换文件多行指定列内容为标准电话号码
提取并标准化文本中的电话号码
原始文件内容
$ 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
命令详解
-F'|':指定竖线|作为列分隔符,拆分每行内容match($列, /\+([0-9]{10,11})/, m):用正则匹配+后面的10或11位数字,匹配到的数字存入数组m的第一个元素- 数字长度判断:如果匹配到的是11位数字,就截取从第2位开始的10位;如果是10位则直接使用
- 最后按目标格式拼接所有列并输出
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

