|
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
状态 离线
|
|
2007-11-13 13:42 |
|