秋木叶 发表于 2018-1-15 19:00:06

分组 和 汇聚 的问题

数据集:
————————————
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都可以
感谢!!

orino 发表于 2018-1-15 19:57:02

这些语言都能搞定的吧

orino 发表于 2018-1-15 20:01:58

然而现在的问题是,你这数据都是C类ip嘛,而且主机号都是连续的嘛?

秋木叶 发表于 2018-1-15 20:16:45

orino 发表于 2018-1-15 20:01
然而现在的问题是,你这数据都是C类ip嘛,而且主机号都是连续的嘛?

不全是C类IP,主机号有连续的,也由单独的

orino 发表于 2018-1-15 20:23:57

秋木叶 发表于 2018-1-15 20:16
不全是C类IP,主机号有连续的,也由单独的

现在不清楚你这汇聚是按24掩码汇总还是按其他的汇总,也不知道不连续主机号的输出格式。只能提供一个思路,可以对以上数据进行排序,主关键字为网络号,次关键字为主机号,然后在输出的时候相同网络号的一起输出,当然这是最直接但效率比较低的方法。

秋木叶 发表于 2018-1-16 10:59:48

orino 发表于 2018-1-15 20:23
现在不清楚你这汇聚是按24掩码汇总还是按其他的汇总,也不知道不连续主机号的输出格式。只能提供一个思路 ...

恩,谢谢,我在试试
按24位掩码

秋木叶 发表于 2018-1-16 15:53:33

我用 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]
查看完整版本: 分组 和 汇聚 的问题