Board logo

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

作者: wangdao6699    时间: 2016-1-6 19:31     标题: 【已解决】批处理如何将前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
作者: pcl_test    时间: 2016-1-6 19:50

  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
复制代码

作者: ksla    时间: 2016-1-6 20:00

一百万个IP内直接使用Excel工作目录建个宏,不用再折腾
作者: CrLf    时间: 2016-1-6 20:01

  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
复制代码

作者: gawk    时间: 2016-1-6 20:25

回复 3# ksla


    照这个理论,搭个数据库啊,查询速度刚刚的。
作者: gawk    时间: 2016-1-6 20:30

本帖最后由 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
复制代码

作者: ksla    时间: 2016-1-6 20:33

回复 5# gawk


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


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

这个主题扣了12分换回来的
作者: gawk    时间: 2016-1-6 21:42

6楼代码里面用到是gawk基础语法,没有涉及到正则表达式。
作者: gawk    时间: 2016-1-6 21:43

回复 7# ksla


    可以问问版主是什么原因扣分,避免以后再被扣。
作者: ksla    时间: 2016-1-6 22:25

回复 6# gawk


    这条代码收藏了!!
作者: codegay    时间: 2016-1-7 06:51

这两问题代码一样

http://www.bathome.net/thread-38037-1-2.html
http://bbs.bathome.net/thread-38219-1-1.html
作者: ksla    时间: 2016-1-7 11:49     标题: 【已解决】批处理如何将前三段相同的ip地址去重复,并将第四段替换成指定字符?

本帖最后由 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
复制代码

作者: codegay    时间: 2016-1-7 13:32

你把处理来的结果再处理几一次看看得到的结果是多少。
作者: codegay    时间: 2016-1-7 13:35

本帖最后由 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

本帖最后由 依山居 于 2016-1-7 13:50 编辑
  1. 文件总行数: 376362
  2. 处理后的行数: 376362
  3. 文件总行数: 376362
  4. 处理后的行数: 376362
  5. 我代码少打了个. 修正后处理的。确实没有重复的。
复制代码

作者: ksla    时间: 2016-1-7 15:21

回复 2# codegay


这个真无去尝试。。。
作者: ksla    时间: 2016-1-7 15:24

回复 4# 依山居


    我用了几个大型软件测试过376362行无有重复的
作者: ksla    时间: 2016-1-7 15:32

回复 3# codegay


    py脚本是如何输出结果的?
作者: gawk    时间: 2016-1-7 15:51

本帖最后由 gawk 于 2016-1-8 13:30 编辑

代码已经更新,你再试试。
http://bbs.bathome.net/thread-38986-1-1.html#pid180838
作者: ksla    时间: 2016-1-7 16:02

回复 8# gawk


    如果有其它不是IP的字符,你的代码会出现一个值...0-20例如:#-------------------中国CN...0-20
作者: gawk    时间: 2016-1-7 16:36

回复 9# ksla


    那个代码是根据IP地址的特点编写的,如果要处理其它例外情况,需要根据实际的数据做调整。
作者: ksla    时间: 2016-1-7 17:36

回复 10# gawk


    原来这样的...直接再做一个代码删除...0-20会不会好点
作者: gawk    时间: 2016-1-7 19:59

回复 22# ksla


    不知道你的原始数据是什么样子,也不知道你希望得到的效果是什么。猜测一行gawk应该够了。
作者: ksla    时间: 2016-1-7 20:12

回复 23# gawk


#---------中国CN
1.1.1.1
2.2.2.2
3.3.3.3
#---------美国EN
4.4.4.4
5.5.5.5
6.6.6.6
作者: wangdao6699    时间: 2016-1-8 08:13

回复 12# ksla


    这位兄台能否介绍几个文本处理器,及怎么用的
作者: WHY    时间: 2016-1-8 11:10

回复 24# ksla
  1. gawk -F"." "$0~/^([0-9]+\.){3}[0-9]+$/&&!a[$1\".\"$2\".\"$3]++{print $1\".\"$2\".\"$3\".0-20\"}" IP.txt>IP_new.txt
复制代码

作者: gawk    时间: 2016-1-8 13:28

回复 24# ksla


gawk "BEGIN{FS=OFS=\".\"}/^[0-9]/{if(!a[$1\"_\"$2\"_\"$3]++)print $1,$2,$3,\"0-20\"}" 1.txt > 2.txt
作者: ksla    时间: 2016-1-8 23:05

回复 26# WHY


#---------中国CN
1.1.1.1
2.2.2.2
3.3.3.3
#---------美国EN
4.4.4.4
5.5.5.5
6.6.6.6

如果保留这些行又如何实现??#---------中国CN

#---------中国CN
1.1.1.0-20
2.2.2.0-20
3.3.3.0-20
#---------美国EN
4.4.4.0-20
5.5.5.0-20
6.6.6.0-20
作者: ksla    时间: 2016-1-8 23:06

回复 27# gawk


    #---------中国CN
1.1.1.1
2.2.2.2
3.3.3.3
#---------美国EN
4.4.4.4
5.5.5.5
6.6.6.6

如果保留这些行又如何实现??#---------中国CN

#---------中国CN
1.1.1.0-20
2.2.2.0-20
3.3.3.0-20
#---------美国EN
4.4.4.0-20
5.5.5.0-20
6.6.6.0-20
作者: ksla    时间: 2016-1-8 23:07

回复 25# wangdao6699


    EmEditorPortable  需要自已研究正规则之类的!!
作者: gawk    时间: 2016-1-9 15:53

回复 29# ksla


gawk "BEGIN{FS=OFS=\".\"}/^[0-9]/{if(!a[$1\"_\"$2\"_\"$3]++)print $1,$2,$3,\"0-20\";next}{print}" 1.txt > 2.txt
作者: WHY    时间: 2016-1-9 21:12

回复 28# ksla
  1. gawk -F"." "{if(/^([0-9]+\.){3}[0-9]+$/){b=$1\".\"$2\".\"$3;if(!a[b]++){print b\".0-20\"}}else{print}}" IP.txt>IP_new.txt
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2