免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3966 | 回复: 12
打印 上一主题 下一主题

[文本处理] 关于将IP替换为国家地区的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-07 12:46 |只看该作者 |倒序浏览
有文件1(目前大概10w条):
uid                   ip
73570393        1919652233
117590132       460543982
117635182       2090914072
117593917       2018699552
117638967       2059534626
117704137       3061075640
117572478       607814676
117635183       1999081805
116518060       1971853825
117691520       1778608004
117663353       2079602722
117540571       1033171794
117071577       2099752338
117673867       1971853002
117710911       1971853833
117680596       3548912785
117663356       1948184791

文件2(其实就是IP库,大概13W条):
ip_start            ip_end            country    province  city  isp
17039360        17039615        澳大利亚
17039616        17040383        中国    福建    电信
17040384        17040639        中国    北京    北龙中网(北京)科技有限责任公司
17040640        17055743        中国    福建    电信
17055744        17072127        中国    广东    电信

希望:将文件1中IP地址在文件2的ip_start和ip_end之间的country、province、city和isp拿过来


譬如:
117686575       18472503        中国    内蒙古  联通
117542440       18469522        中国    内蒙古  联通
117653309       18474402        中国    内蒙古  联通
117582839       18432091        中国    内蒙古  联通
117699940       18450654        中国    内蒙古  联通
117706223       18469084        中国    内蒙古  联通
117672423       18423258        中国    内蒙古  联通

我现在使用以下方法:
awk 'NR==FNR{a[$2]=$0;next} {for(ip in a) {if(int(ip)>=$1 && int(ip)<=$2) {print a[ip]"\t"$3"\t"$4"\t"$5"\t"$6}}}'  文件1 文件2


但是非常的慢,求解更快的方法~~

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
2 [报告]
发表于 2013-04-07 13:01 |只看该作者
本帖最后由 关阴月飞 于 2013-04-07 13:36 编辑

回复 1# 闸北陆小洪


    目测LZ这种将IP换成数字的方法不太对头,
    例如:60.78.141.76  换成数字 607814176 是不严谨的,最好统一换算成这种方式:060078141076

论坛徽章:
0
3 [报告]
发表于 2013-04-07 13:33 |只看该作者
回复 2# 关阴月飞

ip的换算  是按照标准ip2long的方法换算的  这个没问题吧


   

论坛徽章:
0
4 [报告]
发表于 2013-04-07 14:12 |只看该作者
这种查询当然很慢了
我的做法是用一种语言(python,php……选择什么随你)把ip库读入内存,排序之后形成一个数组。
使用时,用2分查找,速度很快。每秒数万次查询没任何问题。
注:ip库中相邻的项如果country    province  city  isp都是相同的,就可以合并。

论坛徽章:
0
5 [报告]
发表于 2013-04-07 15:26 |只看该作者
回复 4# jakieyoung

这个方法我知道是可以的   只是我在寻找shell的方法   你懂的

   

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
6 [报告]
发表于 2013-04-07 16:11 |只看该作者
闸北陆小洪 发表于 2013-04-07 12:46
有文件1(目前大概10w条):
uid                   ip
73570393        1919652233

目测采用二分查找

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
7 [报告]
发表于 2013-04-07 20:24 |只看该作者
回复 5# 闸北陆小洪


    二分法,不用想了,先sort,具体看本人blog,awk也能用二分法的。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
8 [报告]
发表于 2013-04-07 20:26 |只看该作者
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1800295
居然也是ip处理的,自己拷贝改动一下就可以了。

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
9 [报告]
发表于 2013-04-08 09:45 |只看该作者
本帖最后由 rdcwayx 于 2013-04-08 11:46 编辑

借用楼上的代码。
  1. awk 'FNR==1{next}
  2.      NR==FNR {db[++i]=$0;next}
  3.      { start=1;end=i;        
  4.         while(start<=end)
  5.         {  mid=int(start+(end - start)/2)
  6.            split(db[mid], a)
  7.            if ($2 < a[1])
  8.               end=mid-1
  9.            else if($2> a[2])
  10.                      start=mid+1
  11.                 else { print $0,a[3],a[4],a[5],a[6]
  12.                        break }
  13.         }
  14.      }' file2 file1
复制代码

论坛徽章:
0
10 [报告]
发表于 2013-04-09 11:40 |只看该作者
本帖最后由 闸北陆小洪 于 2013-04-09 12:12 编辑

感谢各位   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP