求助,怎样把大量的 ip 地址转换为 ip 段

2015-07-22 20:45:31 +08:00
 gock
例子:
现在有很多的ip,每两个之间用"|"分割,现在需求把这些ip转换成x.x.x.0-x.x.x.255并去掉重复,求代码,谢谢!
4698 次点击
所在节点    Python
13 条回复
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
julyclyde
2015-07-22 21:30:24 +08:00
转成32位数字,然后按最长相同原则进行比较合并
sunchuo
2015-07-22 21:48:16 +08:00
字典树......。
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
leavic
2015-07-23 00:18:58 +08:00
朕写代码时就是这么粗暴的男子
leavic
2015-07-23 00:19:45 +08:00
至于去除重复,用集合就可以了。
gock
2015-07-23 08:48:04 +08:00
求一个完整的代码,没写出来,大神去哪了
yuankui
2015-07-23 09:05:25 +08:00
先把ip转化成一个int32,然后去掉后一个字节变成int24,然后一个hashset就可以直接放了把...
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"
Lumuy
2015-07-24 07:28:46 +08:00
awk -F '|' '!a[$0]++' file
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'])
gordonFreeman
2015-07-24 11:13:02 +08:00
药丸,whitespace没了
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"

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/207620

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX