免费注册 查看新帖 |

Chinaunix

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

[文本处理] awk处理ip数据库 [复制链接]

论坛徽章:
1
巳蛇
日期:2014-04-17 12:33:24
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-04-11 09:26 |只看该作者 |倒序浏览
本帖最后由 iziang 于 2014-04-11 09:37 编辑

现在有一个ip数据库文件,大小是220M,每一行的格式如下
"起始ip","终止ip","国家","省","城市"

下面是几行例子

"1.4.4.0","1.4.4.255","CN","Beijing","Beijing"
"1.5.0.0","1.5.255.255","JP","Tokyo","Chiyoda"
"1.6.0.0","1.7.255.255","IN","Tamil Nadu","Chennai"
"1.8.0.0","1.8.255.255","CN","Beijing","Beijing"
"1.9.0.0","1.9.1.255","MY","Federal Territory of Kuala Lumpur","Kuala Lumpur"
"1.9.2.0","1.9.2.255","MY","Selangor","Cyberjaya"
"1.11.0.0","1.11.255.255","KR","Gyeonggi-do","Bucheon-si"
"1.21.0.0","1.21.255.255","JP","Tokyo","Chiyoda"

每个城市在文件中可能有多个记录

现在要按照拥有ip地址的数量对城市排序,输出的格式如下

城市名:ip总数

大家有没有什么好的办法?

论坛徽章:
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 [报告]
发表于 2014-04-11 10:09 |只看该作者
本帖最后由 关阴月飞 于 2014-04-11 11:14 编辑

开会中,等会贴代码, 来晚了,楼下都写好了,方法是一样的:
  1. [root@ awktest]# awk -F\" 'function ip(s){split(s,a,".");return a[1]*256^3+a[2]*256^2+a[3]*256+a[4]}{b[$(NF-1)]+=(ip($4)-ip($2)+1)}END{for(i in b)print i":"b[i]|"sort -t: -k2nr"}' city
  2. Chennai:131072
  3. Chiyoda:131072
  4. Beijing:65792
  5. Bucheon-si:65536
  6. Kuala Lumpur:512
  7. Cyberjaya:256
  8. [root@ awktest]# cat city
  9. "1.4.4.0","1.4.4.255","CN","Beijing","Beijing"
  10. "1.5.0.0","1.5.255.255","JP","Tokyo","Chiyoda"
  11. "1.6.0.0","1.7.255.255","IN","Tamil Nadu","Chennai"
  12. "1.8.0.0","1.8.255.255","CN","Beijing","Beijing"
  13. "1.9.0.0","1.9.1.255","MY","Federal Territory of Kuala Lumpur","Kuala Lumpur"
  14. "1.9.2.0","1.9.2.255","MY","Selangor","Cyberjaya"
  15. "1.11.0.0","1.11.255.255","KR","Gyeonggi-do","Bucheon-si"
  16. "1.21.0.0","1.21.255.255","JP","Tokyo","Chiyoda"
  17. [root@ awktest]#
复制代码

论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
3 [报告]
发表于 2014-04-11 10:32 |只看该作者
本帖最后由 liaosnet 于 2014-04-11 10:36 编辑

试一下这样。
先做个临时文件,去除双引号。

  1. sed 's#"##g' ufile > tmpfile

  2. awk -F',' 'function ip2num(s){split(s,a,".");return a[1]*16777216+a[2]*65536+a[3]*256+a[4]+1;}{print $5,ip2num($2)-ip2num($1);}' tmpfile | sort -k2nr

复制代码

论坛徽章:
14
15-16赛季CBA联赛之辽宁
日期:2019-06-16 15:47:3515-16赛季CBA联赛之广夏
日期:2016-08-13 21:24:352015亚冠之武里南联
日期:2015-07-07 17:37:372015亚冠之萨济拖拉机
日期:2015-07-06 17:07:482015亚冠之全北现代
日期:2015-06-04 13:54:272015亚冠之城南
日期:2015-05-21 15:43:212015年亚洲杯之伊朗
日期:2015-04-25 18:20:362015年亚洲杯之伊朗
日期:2015-04-20 16:06:052015年亚洲杯之科威特
日期:2015-03-07 12:51:26丑牛
日期:2014-12-30 10:26:38申猴
日期:2014-09-28 22:40:18金牛座
日期:2014-09-13 21:12:22
4 [报告]
发表于 2014-04-11 10:34 |只看该作者
  1. awk -F'"' 'function abs(m){c=256;split(m,ip,".");return ip[4]+ip[3]*c+ip[2]*c^2+ip[1]*c^3}{a[$(NF-1)]=a[$(NF-1)]?a[$(NF-1)]+abs($4)-abs($2):abs($4)-abs($2)}END{for(i in a)print i":"a[i]}' 2.txt   
  2. Bucheon-si:65535
  3. Kuala Lumpur:511
  4. Cyberjaya:255
  5. Chiyoda:131070
  6. Chennai:131071
  7. Beijing:65790
复制代码

论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
5 [报告]
发表于 2014-04-11 10:38 |只看该作者
回复 4# reb00t


      方法一致。。。

论坛徽章:
3
水瓶座
日期:2014-02-20 12:02:14天蝎座
日期:2014-03-19 14:04:46水瓶座
日期:2014-07-26 20:01:02
6 [报告]
发表于 2014-04-11 12:14 |只看该作者
awk 'BEGIN{FS=",";}
function a2n( x)
{
l=split(x,a,".");
return a[1]*256*256*256+a[2]*256*256+a[3]*256+a[4];
}{ gsub(/\"/,"",$5);print $5 ":" a2n($2)-a2n($1) }' yourfile | sort -t ":" -nrk 2

我来凑热闹

论坛徽章:
1
巳蛇
日期:2014-04-17 12:33:24
7 [报告]
发表于 2014-04-11 12:35 |只看该作者
本帖最后由 iziang 于 2014-04-11 12:36 编辑

谢谢大家了,写的都很好,学到了很多。有几个朋友可能没看清题目,城市可能有多条记录的,要计算每个城市总的ip数量

论坛徽章:
11
金牛座
日期:2015-03-19 16:56:22数据库技术版块每日发帖之星
日期:2016-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-04-24 06:20:00数据库技术版块每日发帖之星
日期:2016-04-13 06:20:00IT运维版块每日发帖之星
日期:2016-04-13 06:20:00数据库技术版块每日发帖之星
日期:2016-02-03 06:20:00数据库技术版块每日发帖之星
日期:2015-08-06 06:20:00季节之章:春
日期:2015-03-27 15:54:57羊年新春福章
日期:2015-03-27 15:54:37戌狗
日期:2015-03-19 16:56:41数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
8 [报告]
发表于 2014-04-11 12:57 |只看该作者
本帖最后由 liaosnet 于 2014-04-11 12:58 编辑

回复 7# iziang


    额 。那要再改一下。 话说,LZ就不能举一反三,只是需要结果?

  1. sed 's#"##g' ufile > tmpfile

  2. awk -F',' 'function ip2num(s){split(s,a,".");return a[1]*16777216+a[2]*65536+a[3]*256+a[4]+1;}{sum[$5]+=(ip2num($2)-ip2num($1));}END{for(i in sum)print i,sum[i];}' tmpfile | sort -k2nr

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP