分组 和 汇聚 的问题
数据集:————————————
192.168.1.1
192.168.1.2
192.168.1.3
192.168.2.1
192.168.1.101
192.168.1.100
192.168.2.2
192.168.2.3
192.168.3.1
192.168.1.4
————————————
希望输出结果为:
————————————
192.168.1.1-4
192.168.1.100-101
192.168.2.1-3
192.168.3.1
————————————
求大佬们出个主意,c,python,shell,awk都可以
感谢!! 这些语言都能搞定的吧 然而现在的问题是,你这数据都是C类ip嘛,而且主机号都是连续的嘛? orino 发表于 2018-1-15 20:01
然而现在的问题是,你这数据都是C类ip嘛,而且主机号都是连续的嘛?
不全是C类IP,主机号有连续的,也由单独的 秋木叶 发表于 2018-1-15 20:16
不全是C类IP,主机号有连续的,也由单独的
现在不清楚你这汇聚是按24掩码汇总还是按其他的汇总,也不知道不连续主机号的输出格式。只能提供一个思路,可以对以上数据进行排序,主关键字为网络号,次关键字为主机号,然后在输出的时候相同网络号的一起输出,当然这是最直接但效率比较低的方法。 orino 发表于 2018-1-15 20:23
现在不清楚你这汇聚是按24掩码汇总还是按其他的汇总,也不知道不连续主机号的输出格式。只能提供一个思路 ...
恩,谢谢,我在试试
按24位掩码 我用 awk解决了,谢谢大家的帮助!!
这个是我的方法,仅用于24位掩码,可能存在bug,大牛们多多指正!
#!/bin/awk -f
{
all[$1] = $1;
split($1,a,".");
ipc"."a"."a] = a"."a"."a;
}
END{
for(i in ipc) ##遍历 IP c段
{
count = 0;##下一个c段开始时计数归零
for(j = 1; j < 256; j++) ##检查每一个ip是否存在
{
if(i"."j in all)##ip存在开始计数,输出标志位为1
{
k = j;
count++; ##连续的个数累加计数
flag = 1;
}
ipb = k - count + 1; ##ip_begin
ipe = k; ##ip_end
if(k != j)##出现不连续的,将计数归零(连续的个数归零)
{
count = 0;
}
if( k != j && flag == 1)##将连续的段输出,并将输出标志位为0
{
if(ipb == ipe)
{
print i"."ipb;
}
else
{
print i"."ipb"-"ipe;
}
flag = 0;
}
}
}
}
这个是执行结果:
# cat ip
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5
192.168.1.10
192.168.1.11
192.168.1.15
192.168.1.17
192.168.1.18
192.168.1.19
192.168.2.1
192.168.2.2
192.168.2.3
192.168.2.10
192.168.2.11
10.174.192.2
10.174.192.5
10.174.192.4
# ./ip_together.awk ip
10.174.192.2
10.174.192.4-5
192.168.1.1-5
192.168.1.10-11
192.168.1.15
192.168.1.17-19
192.168.2.1-3
192.168.2.10-11
页:
[1]