1
mike163 2015-07-22 20:51:52 +08:00
刚用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-07-22 21:30:24 +08:00
转成32位数字,然后按最长相同原则进行比较合并
|
3
sunchuo 2015-07-22 21:48:16 +08:00
字典树......。
|
4
leavic 2015-07-23 00:17:50 +08:00
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-07-23 00:18:58 +08:00
朕写代码时就是这么粗暴的男子
|
6
leavic 2015-07-23 00:19:45 +08:00
至于去除重复,用集合就可以了。
|
7
gock OP 求一个完整的代码,没写出来,大神去哪了
|
8
yuankui 2015-07-23 09:05:25 +08:00
先把ip转化成一个int32,然后去掉后一个字节变成int24,然后一个hashset就可以直接放了把...
|
9
mike163 2015-07-23 17:36:30 +08:00
完整的代码:
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-07-24 07:28:46 +08:00
awk -F '|' '!a[$0]++' file
|
11
gordonFreeman 2015-07-24 11:12:19 +08:00
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-07-24 11:13:02 +08:00
药丸,whitespace没了
|
13
mike163 2015-07-24 22:00:43 +08:00
再来:
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" |