例子:
现在有很多的ip,每两个之间用"|"分割,现在需求把这些ip转换成x.x.x.0-x.x.x.255并去掉重复,求代码,谢谢!
现在有很多的ip,每两个之间用"|"分割,现在需求把这些ip转换成x.x.x.0-x.x.x.255并去掉重复,求代码,谢谢!
|
mike163Jul 22, 2015
1
刚用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 |
|
julyclydeJul 22, 2015
2
转成32位数字,然后按最长相同原则进行比较合并
|
|
sunchuoJul 22, 2015
3
字典树......。
|
|
leavicJul 23, 2015
4
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 |
|
leavicJul 23, 2015
5
朕写代码时就是这么粗暴的男子
|
|
leavicJul 23, 2015
6
至于去除重复,用集合就可以了。
|
|
7
求一个完整的代码,没写出来,大神去哪了
|
|
yuankuiJul 23, 2015
8
先把ip转化成一个int32,然后去掉后一个字节变成int24,然后一个hashset就可以直接放了把...
|
|
mike163Jul 23, 2015
9
完整的代码:
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" |
|
LumuyJul 24, 2015
10
awk -F '|' '!a[$0]++' file
|
|
gordonFreemanJul 24, 2015
11
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']) |
|
gordonFreemanJul 24, 2015
12
药丸,whitespace没了
|
|
mike163Jul 24, 2015
13
再来:
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" |