求助:使用awk实现10位手机号与短数字的后缀匹配
AWK实现手机号后缀匹配解决方案
假设你的Table1数据存储在table1.txt,Table2数据存储在table2.txt,可以使用以下AWK脚本实现需求:
完整脚本(可读性优先)
创建名为match_mobile.awk的文件,内容如下:
# 读取Table1的手机号,存入数组 NR == FNR { # 跳过表头行 if (NR > 1) { mobiles[$0] = $0 } next } # 输出结果表头 FNR == 1 { print "display\tOutput" next } # 处理Table2的每个display字段 { display = $0 # 获取当前display的长度 len = length(display) # 遍历所有手机号,匹配后缀 for (mobile in mobiles) { # 截取手机号的后len位进行匹配 if (substr(mobile, 11 - len) == display) { # 按tab分隔输出结果 printf "%s\t%s\n", display, mobile # 找到匹配后退出循环(假设唯一匹配) break } } }
运行命令:
awk -f match_mobile.awk table1.txt table2.txt
单行精简命令
如果需要直接在终端执行,可使用单行版本:
awk 'NR==FNR{if(NR>1)mobiles[$0]=$0;next}FNR==1{print "display\tOutput";next}{len=length($0);for(m in mobiles)if(substr(m,11-len)==$0){printf "%s\t%s\n",$0,m;break}}' table1.txt table2.txt
关键逻辑说明
- 读取Table1数据:利用
NR==FNR判断当前处理的是第一个输入文件(Table1),跳过表头后将所有10位手机号存入数组mobiles。 - 输出结果表头:处理第二个文件(Table2)的第一行时,输出指定的表头
display\tOutput。 - 后缀匹配:对Table2的每个display字段,计算其长度
len,然后截取手机号的后len位(通过substr(mobile, 11 - len)实现,因为10位手机号的起始位置为10 - len + 1 = 11 - len),与display字段比对,匹配成功则输出结果。
注意事项
- 确保Table1中的手机号均为严格10位数字,无额外字符;Table2中的display字段均为纯数字。
- 脚本默认每个display字段仅存在一个匹配的手机号,若存在多个匹配,可去掉
break语句以输出所有匹配结果。 - 输出使用tab分隔,可根据需求修改
printf中的分隔符(比如替换为空格)。
内容的提问来源于stack exchange,提问作者Mahendra Seth
相关产品推荐
相关产品推荐

