中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-06 12:21
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助][没人能帮我吗]求将零散ip段整合的批处理【急】 查看 773 回复 12
楼 主 [求助][没人能帮我吗]求将零散ip段整合的批处理【急】 发表于 2007-11-12 23:18 ·  中国 湖北 武汉 电信
初级用户
积分 64
发帖 43
注册 2007-11-12 00:57
18年会员
UID 102390
性别 男
状态 离线
从纯真数据库上去一段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
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
lxmxn -12 2007-11-12 23:33
2 发表于 2007-11-12 23:30 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
如果A段不同,则继续选择下面的ip进行A段的比较。

如果第一行和第二行的A段不同,那么是拿第三行和第一行比较,还是拿第三行和第二行比较,还是比较第一行和第二行后面的两行(即第三行和第四行)?
3 发表于 2007-11-12 23:34 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
同样的贴子在论坛发了几次了,扣12分惩罚。
4 发表于 2007-11-12 23:47 ·  中国 湖北 武汉 电信
初级用户
积分 64
发帖 43
注册 2007-11-12 00:57
18年会员
UID 102390
性别 男
状态 离线
我知道要扣分

可是 我的确很想寻求帮助!!!!
5 发表于 2007-11-12 23:51 ·  中国 湖北 武汉 电信
初级用户
积分 64
发帖 43
注册 2007-11-12 00:57
18年会员
UID 102390
性别 男
状态 离线
Originally posted by lxmxn at 2007-11-12 11:30 PM:

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



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

所以如果 第一行和第二行的A段不同 ,就直接比较 第二行和第三行的A段
6 发表于 2007-11-12 23:59 ·  中国 广东 广州 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564
发帖 1,127
注册 2006-12-25 22:57
19年会员
UID 74552
性别 男
状态 离线
不需要考虚后边那些地址注释?例如我把龙岗的跟罗湖的合并在一起
7 发表于 2007-11-13 00:36 ·  中国 湖北 武汉 电信
初级用户
积分 64
发帖 43
注册 2007-11-12 00:57
18年会员
UID 102390
性别 男
状态 离线
Originally posted by everest79 at 2007-11-12 11:59 PM:
不需要考虚后边那些地址注释?例如我把龙岗的跟罗湖的合并在一起


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

我有思路 可是不会些!! 郁闷啊!!
8 发表于 2007-11-13 00:40 ·  中国 湖北 武汉 电信
初级用户
积分 64
发帖 43
注册 2007-11-12 00:57
18年会员
UID 102390
性别 男
状态 离线
大哥能留下你的qq吗?
我在非常批处理 和 百度知道都提问了
可惜么人能帮我!

那位高手能帮帮我 啊! 感激不尽!
9 发表于 2007-11-13 10:03 ·  中国 云南 昆明 联通
初级用户
积分 90
发帖 43
注册 2007-10-31 11:00
18年会员
UID 101268
性别 男
状态 离线
有空我来帮你写吧,这个用二进制去解决会容易很多。

这两天工作忙,加我qq聊吧58280608
10 发表于 2007-11-13 10:32 ·  中国 广东 广州 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564
发帖 1,127
注册 2006-12-25 22:57
19年会员
UID 74552
性别 男
状态 离线

@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

现写的,你发的例子没问题
11 发表于 2007-11-13 11:15 ·  中国 云南 昆明 联通
初级用户
积分 90
发帖 43
注册 2007-10-31 11:00
18年会员
UID 101268
性别 男
状态 离线
楼上的set %~2=%~3这句有意思
我一般用set %2=
12 非常感谢10楼的大哥! 发表于 2007-11-13 11:45 ·  中国 湖北 武汉 电信
初级用户
积分 64
发帖 43
注册 2007-11-12 00:57
18年会员
UID 102390
性别 男
状态 离线
万分感谢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 ]
13 发表于 2007-11-13 13:42 ·  中国 江苏 南京 联通
初级用户
积分 23
发帖 17
注册 2007-11-10 20:25
18年会员
UID 102280
性别 男
状态 离线
呵呵 学习了
论坛跳转: