找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 111420|回复: 31

[文本处理] 【已解决】批处理如何将前三段相同的ip地址去重复,并将第四段替换成指定字符?

[复制链接]
发表于 2016-1-7 11:49:26 | 显示全部楼层 |阅读模式
本帖最后由 pcl_test 于 2016-9-18 18:53 编辑

昨天有位人兄发帖需要以下功能!下面的代码能实现!

这个代码里的功能对我并无有用处,因为很多文本处理器可以完美做到,一千多万行也是几秒的事,但今天使用了一下!发现了漏掉问题

本人用的是gawk 4.1.3,windows10

对一个有376362行的文本进行处理,去重并将第四列替换为0-20后得出365993行,漏掉了10369行!!xxx.xxx.xxx.0-20得出的结果是以IP范围为格式,所以再乘20等于漏掉了207380个IP

可能有人会认为376362个IP有重复,但这376362行IP是无有重复的,格式为xxx.xxx.xxx.0



大家可以测试一下!
http://pan.baidu.com/s/1gdRzB6F

删除前3列相同ip地址,去重并将第四列替换为0-20
文本1:
58.217.200.13
58.217.200.15  
220.181.185.141
58.217.200.37   
61.135.185.31  
123.126.99.31
61.135.185.32
输出文本2:
58.217.200.0-20  
220.181.185.0-20  
61.135.185.0-20  
123.126.99.0-20

出现问题是这条代码!
  1. gawk "BEGIN{FS=OFS="."}{if(!a[$1.$2.$3]++)print $1,$2,$3,"0-20"}" 1.txt > 2.txt
复制代码
正确代码为“
  1. gawk "BEGIN{FS=OFS="."}{if(!a[$1"_"$2"_"$3]++)print $1,$2,$3,"0-20"}" 1.txt > 2.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
wangdao6699 + 1 感谢兄台测试,修改,优化代码

查看全部评分

发表于 2016-1-6 19:31:27 | 显示全部楼层

【已解决】批处理如何将前3段相同的ip地址去重复,并将第4段替换成指定字符?

本帖最后由 pcl_test 于 2016-7-18 12:22 编辑

删除前3列相同ip地址,第四列全部并替换为0-20
文本a:
58.217.200.13
58.217.200.15  
220.181.185.141
58.217.200.37   
61.135.185.31  
123.126.99.31
61.135.185.32
输出文本b:
58.217.200.0-20  
220.181.185.0-20  
61.135.185.0-20  
123.126.99.0-20

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2016-1-6 19:50:18 | 显示全部楼层
  1. @echo off
  2. for /f %%a in ('more +8 "%~f0"') do (
  3.     if not defined #%%~na (
  4.         echo;%%~na.0-20
  5.         set #%%~na=1
  6.     )
  7. )
  8. pause&exit
  9. 58.217.200.13
  10. 58.217.200.15  
  11. 220.181.185.141
  12. 58.217.200.37   
  13. 61.135.185.31  
  14. 123.126.99.31
  15. 61.135.185.32
复制代码

评分

参与人数 1技术 +1 收起 理由
wangdao6699 + 1 代码如此简洁,太厉害了

查看全部评分

 楼主| 发表于 2016-1-6 20:00:06 | 显示全部楼层
一百万个IP内直接使用Excel工作目录建个宏,不用再折腾
发表于 2016-1-6 20:01:19 | 显示全部楼层
  1. @mshta http://bathome.net/s/hta/?%random%^
  2. o={};^
  3. type('文本a.txt')^
  4. .replace(/\d+\.\d+\.\d+/mg,function(m){o[m+'.0-20']=1})^
  5. names(o).join('\r\n')^
  6. >文本b.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
wangdao6699 + 1 正则表达式用的炉火纯青,赞一个

查看全部评分

发表于 2016-1-6 20:25:25 | 显示全部楼层
回复 3# ksla


    照这个理论,搭个数据库啊,查询速度刚刚的。
发表于 2016-1-6 20:30:26 | 显示全部楼层
本帖最后由 gawk 于 2016-1-7 15:50 编辑
  1. gawk "BEGIN{FS=OFS="."}{if(!a[$1.$2.$3]++)print $1,$2,$3,"0-20"}" 1.txt > 2.txt
复制代码
经网友测试,以上代码是错误的。修正之后的代码如下:
  1. gawk "BEGIN{FS=OFS="."}{if(!a[$1"_"$2"_"$3]++)print $1,$2,$3,"0-20"}" 1.txt > 2.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
wangdao6699 + 1 很喜欢,第三方工具,就是正则表达式太难了

查看全部评分

 楼主| 发表于 2016-1-6 20:33:48 | 显示全部楼层
回复 5# gawk


    哥们,,这么有空,帮忙优化下我串代码


帖子:如何提取ping命令结果中响应时间最短的IP并将相关信息输出到hosts文件?

这个主题扣了12分换回来的
发表于 2016-1-6 21:42:46 | 显示全部楼层
6楼代码里面用到是gawk基础语法,没有涉及到正则表达式。
发表于 2016-1-6 21:43:56 | 显示全部楼层
回复 7# ksla


    可以问问版主是什么原因扣分,避免以后再被扣。
 楼主| 发表于 2016-1-6 22:25:57 | 显示全部楼层
回复 6# gawk


    这条代码收藏了!!
发表于 2016-1-7 06:51:58 | 显示全部楼层
发表于 2016-1-7 13:32:03 | 显示全部楼层
你把处理来的结果再处理几一次看看得到的结果是多少。
发表于 2016-1-7 13:35:37 | 显示全部楼层
本帖最后由 codegay 于 2016-1-7 13:53 编辑
  1. """
  2. 依山居 2016年1月7日 13:18:56
  3. """
  4. with open("IP.txt") as f:
  5.     txt=f.readlines()
  6. print("文件总行数:",len(txt))
  7. ip={'.'.join(r.split(".")[:3]+["0-20\n"]) for r in txt}
  8. ip=sorted(ip)
  9. print("处理后的行数:",len(ip))
复制代码
发表于 2016-1-7 13:46:42 | 显示全部楼层
本帖最后由 依山居 于 2016-1-7 13:50 编辑
  1. 文件总行数: 376362
  2. 处理后的行数: 376362
  3. 文件总行数: 376362
  4. 处理后的行数: 376362

  5. 我代码少打了个. 修正后处理的。确实没有重复的。
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-21 00:29 , Processed in 0.032053 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表