
1 mike163 2015 年 7 月 22 日 刚用ruby 写了一个 ta是一个ip addr list def merge_ip_list(ta) nta = ta.map do |h| na = (h[:ip].scan /[0-9]+\./) na[0]+na[1]+na[2]+'0/24' end nta.uniq! ra=nta.map do |ip| ind = ip.index('0/24') s1 = ip[0..ind-1] rep_times = ta.count{|h| h[:ip].index(s1)!=nil} final = (rep_times>1) ? ip : (ta.find{|h| h[:ip].index(s1)!=nil})[:ip] i_counter = (ta.select{|h| h[:ip].index(s1)!=nil}).inject(0) { |mem, var| mem + var[:counter] } {:ip=>final,:counter=>i_counter} end return ra end |
2 julyclyde 2015 年 7 月 22 日 转成32位数字,然后按最长相同原则进行比较合并 |
3 sunchuo 2015 年 7 月 22 日 字典树......。 |
4 leavic 2015 年 7 月 23 日 str_a='192.168.9.12|192.168.9.24' ip_list=str_a.split('|') ip_list_left=ip_list[0].split('.') ip_list_right=ip_list[1].split('.') ip_list_left[3]='0' ip_list_right[3]='255' ip_left='.'.join(ip_list_left) ip_right='.'.join(ip_list_right) ip_final=ip_left+'-'+ip_right print ip_final =========== 192.168.9.0-192.168.9.255 |
5 leavic 2015 年 7 月 23 日 朕写代码时就是这么粗暴的男子 |
6 leavic 2015 年 7 月 23 日 至于去除重复,用集合就可以了。 |
7 gock OP 求一个完整的代码,没写出来,大神去哪了 |
8 yuankui 2015 年 7 月 23 日 先把ip转化成一个int32,然后去掉后一个字节变成int24,然后一个hashset就可以直接放了把... |
9 mike163 2015 年 7 月 23 日 完整的代码: def merge_ip_list(s) ta = s.split('|') nta = ta.map do |h| na = (h.scan /[0-9]+\./) na[0]+na[1]+na[2]+'0-'+ na[0]+na[1]+na[2]+'255' end nta.uniq! nta.each {|x| p x} end ----------------- 测试: merge_ip_list('192.168.2.1|192.168.2.9|192.168.3.1') "192.168.2.0-192.168.2.255" "192.168.3.0-192.168.3.255" |
10 Lumuy 2015 年 7 月 24 日 awk -F '|' '!a[$0]++' file |
11 gordonFreeman 2015 年 7 月 24 日 2个类似的方法 merge_ip_list 是 @leavic 的方法 ######################################## #-*- coding:utf-8 -*- from sets import Set def merge_ip_list(ip_array): ip_list = ip_array.split('|') full_list = Set([]) for ip in ip_list: ip_L = ip.split('.') ip_L[3] = '0' ip_R = ip.split('.') ip_R[3] = '255' full_list.add('%s - %s' % ('.'.join(ip_L), '.'.join(ip_R))) return full_list def merge_ip_list_2(ip_array): full_list = Set([]) ip_list_splited = [x.split('.') for x in ip_array.split('|')] for ip in ip_list_splited: ip_head = '%s.%s.%s' % (ip[0], ip[1], ip[2]) full_list.add('%s.0 - %s.255' % (ip_head, ip_head)) return full_list ######################################### ip_array = '192.17.23.3|192.16.80.209|192.16.80.200' print merge_ip_list(ip_array) print merge_ip_list_2(ip_array) 2个方法皆返回: Set(['192.16.80.0 - 192.16.80.255', '192.17.23.0 - 192.17.23.255']) |
12 gordonFreeman 2015 年 7 月 24 日 药丸,whitespace没了 |
13 mike163 2015 年 7 月 24 日 再来: s='192.168.2.1|192.168.2.9|192.168.3.1' s.split('|').map {|h| ts=h.scan(/[0-9]+\.[0-9]+\.[0-9]+\./)[0]; ts+'0-'+ts+'255' }.uniq.each {|x| p x} 结果: "192.168.2.0-192.168.2.255" "192.168.3.0-192.168.3.255" |