中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助][没人能帮我吗]求将零散ip段整合的批处理【急】
作者:
标题: [求助][没人能帮我吗]求将零散ip段整合的批处理【急】 上一主题 | 下一主题
cz1314
初级用户





积分 64
发帖 43
注册 2007-11-12
状态 离线
『楼 主』:  [求助][没人能帮我吗]求将零散ip段整合的批处理【急】

从纯真数据库上去一段ip如下

-------------以下是取样-------------------------------------
58.60.232.202   58.60.232.203   广东省深圳市龙岗区 电信
58.60.232.204   58.60.232.204   广东省深圳市龙岗区 龙平东路宇宙村网吧
58.60.232.205   58.60.232.255   广东省深圳市龙岗区 电信
58.60.233.0     58.60.239.255   广东省深圳市 电信  
58.60.240.0     58.60.243.255   广东省深圳市龙岗区 电信
58.60.244.0     58.61.3.255     广东省深圳市 电信
58.61.4.0       58.61.4.255     广东省深圳市罗湖区 电信
58.61.5.0       58.61.5.255     广东省深圳市龙岗区 电信
58.61.6.0       58.61.7.255     广东省深圳市 电信
58.61.8.0       58.61.8.255     广东省深圳市福田区 电信
58.61.9.0       58.61.19.255    广东省深圳市 电信
58.61.20.0      58.61.20.255    广东省深圳市宝安区 电信
58.62.37.0      58.62.40.255    广东省广州市 电信
58.62.41.0      58.62.41.255    广东省广州市白云区 电信
58.62.42.0      58.62.42.135    广东省广州市 大学城
58.63.104.0     58.63.105.255   广东省广州市天河区 电信
58.63.106.0     58.63.106.255   广东省广州市白云区 电信
58.63.107.0     58.63.107.255   广东省广州市天河区 电信
---------------------------------------------------------
59.40.0.0       59.51.0.0       广东省汕头市 (潮南区/潮阳区)电信ADSL
61.20.0.0       61.28.0.0       广东省广州市白云区 电信
-------------以上是取样---------------------------
--------------------------------------------------
我希望把上面的ip地址整理成下面这样:

58.60.0.0       58.64.0.0

59.40.0.0       59.45.0.0
59.45.0.0       59.50.0.0
59.50.0.0       59.51.0.0
61.20.0.0       61.25.0.0
61.25.0.0       61.28.0.0
---------------------------------------------------------


简单解释下 :

把ip分为  A B C D 4个段  即 A.B.C.D
一  首先比较 A段:
1   如果A段相同则继续比较B段,如果上下2段ip的B 段差 小于(等于)1,则合并这2段。(比较的是红色部分)
    例如:
    --------------以下是取样----------------------------------
    58.60.244.0     58.61.3.255     广东省深圳市 电信
    58.61.4.0       58.61.4.255     广东省深圳市罗湖区 电信
    --------------以上是取样----------------------------------
    将整理成: 58.60.244.0 58.61.4.255   
   
2   如果A段不同,则继续选择下面的ip进行A段的比较。
    依次类推!

二  比较同一行 B 段ip
1   如果同一行的 B 段 ip 差小于(等于)5,则继续取下一行进行比较。

2   如果同一行的 B 段 ip 差大于 5 ,则以5为单位进行划分。

    例如:
    --------------以下是取样----------------------------------
    59.40.0.0       59.51.0.0       广东省汕头市 (潮南区/潮阳区)电信ADSL
    61.20.0.0       61.28.0.0       广东省广州市白云区 电信
    --------------以上是取样----------------------------------
    将整理成:
    59.40.0.0       59.45.0.0
    59.45.0.0       59.50.0.0
    59.50.0.0       59.51.0.0
    61.20.0.0       61.25.0.0
    61.25.0.0       61.28.0.0
   
希望高高手赐教如何写这样的批处理命令,

以上 一、二 2个部分 可以分为2个批处理分开处理,如果能合成一个那就更完美了

小弟跪求!! 愿送135服务器一台!!
                                                  QQ:1919134

   此帖被 -12 点积分      点击查看详情   
评分人:【 lxmxn 分数: -12  时间:2007-11-12 23:33


2007-11-12 23:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 2 楼』:  



  Quote:
如果A段不同,则继续选择下面的ip进行A段的比较。

如果第一行和第二行的A段不同,那么是拿第三行和第一行比较,还是拿第三行和第二行比较,还是比较第一行和第二行后面的两行(即第三行和第四行)?

2007-11-12 23:30
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 3 楼』:  

同样的贴子在论坛发了几次了,扣12分惩罚。

2007-11-12 23:34
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
cz1314
初级用户





积分 64
发帖 43
注册 2007-11-12
状态 离线
『第 4 楼』:  

我知道要扣分

可是 我的确很想寻求帮助!!!!

2007-11-12 23:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
cz1314
初级用户





积分 64
发帖 43
注册 2007-11-12
状态 离线
『第 5 楼』:  



  Quote:
Originally posted by lxmxn at 2007-11-12 11:30 PM:

如果第一行和第二行的A段不同,那么是拿第三行和第一行比较,还是拿第三行和第二行比较,还是比较第一行和第二行后面的两行(即第三行和第四行)?

因为从纯真ip数据库上取下来的原始数据都是按ip 顺序排列好了的!

所以如果 第一行和第二行的A段不同 ,就直接比较 第二行和第三行的A段

2007-11-12 23:51
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 6 楼』:  

不需要考虚后边那些地址注释?例如我把龙岗的跟罗湖的合并在一起

2007-11-12 23:59
查看资料  发短消息 网志   编辑帖子  回复  引用回复
cz1314
初级用户





积分 64
发帖 43
注册 2007-11-12
状态 离线
『第 7 楼』:  



  Quote:
Originally posted by everest79 at 2007-11-12 11:59 PM:
不需要考虚后边那些地址注释?例如我把龙岗的跟罗湖的合并在一起

不用  文字全部可以去掉!
其实主要 是整理 ip 的 a段和b段!  c d 都可以不考虑!

我有思路 可是不会些!! 郁闷啊!!

2007-11-13 00:36
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
cz1314
初级用户





积分 64
发帖 43
注册 2007-11-12
状态 离线
『第 8 楼』:  

大哥能留下你的qq吗?
我在非常批处理 和 百度知道都提问了
可惜么人能帮我!

那位高手能帮帮我 啊! 感激不尽!

2007-11-13 00:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
genteman
初级用户





积分 90
发帖 43
注册 2007-10-31
状态 离线
『第 9 楼』:  

有空我来帮你写吧,这个用二进制去解决会容易很多。

这两天工作忙,加我qq聊吧58280608

2007-11-13 10:03
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
everest79
金牌会员

一叶枝头,万树皆春



积分 2564
发帖 1127
注册 2006-12-25
状态 离线
『第 10 楼』:  


@echo off
set text=a,b,c,e,f,g,h

for /f "tokens=1-8* delims=. " %%a in (ip.txt) do (
call :x1 %%a %%b %%c %%d %%e %%f %%g %%h
)
call :txout

echo -------------------------------------------------------

for /f "tokens=1-8* delims=. " %%a in (ip.txt) do (
set/a ao=%%a,bo=%%b,co=%%c,do=%%d,eo=%%e,fo=%%f,go=%%g,ho=%%h
call :x2
)
goto end

:x1
if not defined ao (
set/a ao=%1,bo=%2,co=%3,do=%4,eo=%5,fo=%6,go=%7,ho=%8&&goto :eof
) else (
if not defined an (
set/a an=%1,bn=%2,cn=%3,dn=%4,en=%5,fn=%6,gn=%7,hn=%8)
)
set/a 1/(ao-en) 2>nul&&call :txout&&call :clear "%text%" "%%%%xo"&&goto x1
if %bo% geq %fn% (set/a B=bo-fn) else (set/a B=fn-bo)
if %b% leq 1 (
set/a eo=en,fo=fn,go=gn,ho=hn
call :clear "%text%" "%%%%xn"
) else (
call :txout
call :clear "%text%" "%%%%xo"
goto x1
)
goto :eof

:x2
set/a aaa=((bo-fo)*2+1)%%2*(bo-fo),1/(aaa/6) 2>nul||goto txout
set/a loop=aaa/5,zzz=aaa%%5,fo=bo
for /l %%x in (1,1,%loop%) do (
set/a fo+=5
call :txout
set/a bo+=5
)
set/a bo=fo,fo+=zzz
call :txout
goto :eof

:clear
for %%x in (%~1) do set %~2=%~3
goto :eof

:txout
echo %ao%.%bo%.%co%.%do%   %eo%.%fo%.%go%.%ho%
goto :eof


:end
pause
goto :eof
现写的,你发的例子没问题

2007-11-13 10:32
查看资料  发短消息 网志   编辑帖子  回复  引用回复
genteman
初级用户





积分 90
发帖 43
注册 2007-10-31
状态 离线
『第 11 楼』:  

楼上的set %~2=%~3这句有意思
我一般用set %2=

2007-11-13 11:15
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
cz1314
初级用户





积分 64
发帖 43
注册 2007-11-12
状态 离线
『第 12 楼』:  非常感谢10楼的大哥!

万分感谢10楼的朋友,但貌似还有点小问题。
由于我太菜,看不大懂你写的内容。你能把思路和每小段代码的功能注释下吗?

下面是我自己写的一点,只能在A段相同的时候比较 B 段和合并 B 段。
由于是初学,代码写的很垃圾,请大侠们不要怜惜口水,多多指教。




    @echo off
    @for /f "eol= tokens=1,2 delims= " %%i in (ip.txt) do echo %%i %%j>>tmp.txt

    :去点
    setlocal ENABLEDELAYEDEXPANSION
    set FILENAME=tmp.txt
    SET PH=%FILENAME:~0,-1%
    set STR1=.
    SET STR2=
    for /f "tokens=* delims= " %%a in (%FILENAME%) do (
    set n=%%a
    set n=!n:%STR1%=%STR2%!
    echo.!n!>>%PH%
    )
    DEL %FILENAME%
    copy %PH% %FILENAME%
    del %PH%


    :去掉CD段
    @echo :::::由于不考虑C D段iip,所以将每行后面的ip的 B段 进一位,这样会方便很多,而且不会漏掉ip段::::::
    @for /f "eol= tokens=1,2,3,4,5,6 delims= " %%a in (tmp.txt) do (

    set /a Num=%%f+1

    echo %%a %%b   %%e !Num! >>tmp1.txt
    )

    del tmp.txt
    :去掉256
    @echo ::::因为上面将b段加1,所以如果原来的b段是255就会变成266了,呵呵:::
    setlocal ENABLEDELAYEDEXPANSION
    set FILENAME=tmp1.txt
    SET PH=%FILENAME:~0,-1%
    set STR1=256
    SET STR2=255   
    for /f "tokens=* delims= " %%a in (%FILENAME%) do (
    set n=%%a
    set n=!n:%STR1%=%STR2%!
    echo.!n!>>%PH%
    )
    DEL %FILENAME%
    copy %PH% %FILENAME%
    del %PH%
    endlocal enabledelayedexpansion
    @echo :::::::::::::::: ::::::::::::::::::::

    for /f "delims=" %%i in (tmp1.txt) do (
        if not defined %%i set %%i=A & echo %%i>>1.txt)

    :两行合一行


    cls
    set num=0
    setlocal enabledelayedexpansion
    for /f "delims=" %%i in (1.txt) do (
        set /a num+=1
        set str=!str! %%i
        if !num! equ 2 echo !str!>>2.txt&& set num=0 & set str=
    )
    endlocal enabledelayedexpansion

    :判断是否存在相同的B段
    @for /f "eol=  tokens=1,2,3,4,5,6,7,8  delims= " %%1  in (2.txt) do (
    if not %%4 LSS %%6 goto 合并B段
    )

    del 2.txt

    del tmp.txt

    @for /f "eol=  tokens=1,2,3,4  delims= " %%i  in (1.txt) do (
    echo %%i.%%j.0.0  %%k.%%l.0.0>>ok.txt
    )

    exit

    :合并B段

    del 1.txt
    @for /f "eol=  tokens=1,2,3,4,5,6,7,8  delims= " %%1  in (2.txt) do (

    if  %%4 GEQ %%6 (
    echo %%1 %%2   %%7 %%8 >> 1.txt

    ) else (
    echo %%1 %%2   %%3 %%4 >> 1.txt
    echo %%5 %%6   %%7 %%8 >> 1.txt
    )
    )



    del 2.txt

    goto 两行合一行




我写的这个代码存在2个很大的问题不知道怎么解决


只能在 A 段相同的情况下比较和合并B段。
如果A段不同就会出现这样的错误:
————————————————————
202.103.24.68 202.103.25.0
203.103.103.0 204.105.255.0
————————————————————
会错误的将以上ip段整理成
202.103.0.0 204.106.0.0


在比较合并B 段的时候,

代码中 “:两行合一行”这部分 有很大问题,
当总行数为奇数时会把最后一行ip忽略掉,每比较一次都会忽略一行。



以上2个问题请大侠门指点!!
小第万分感激!!

[ Last edited by cz1314 on 2007-11-13 at 12:02 PM ]

2007-11-13 11:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
huziivy
初级用户





积分 23
发帖 17
注册 2007-11-10
状态 离线
『第 13 楼』:  

呵呵 学习了

2007-11-13 13:42
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: