[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 【已解决】批处理如何将前三段相同的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
复制代码
1

评分人数

    • wangdao6699: 感谢兄台测试,修改,优化代码技术 + 1

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

评分人数

    • ksla: 乐于助人技术 + 1

TOP

回复 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
1

评分人数

    • ksla: 乐于助人技术 + 1
Talk is cheap. Show me the code.
没事不要瞎扯淡,有能耐就把代码贴出来给我看。

TOP

回复 25# wangdao6699


    EmEditorPortable  需要自已研究正规则之类的!!

TOP

回复 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

TOP

回复 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

TOP

回复 24# ksla


gawk "BEGIN{FS=OFS=\".\"}/^[0-9]/{if(!a[$1\"_\"$2\"_\"$3]++)print $1,$2,$3,\"0-20\"}" 1.txt > 2.txt
1

评分人数

    • ksla: 乐于助人技术 + 1
Talk is cheap. Show me the code.
没事不要瞎扯淡,有能耐就把代码贴出来给我看。

TOP

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

评分人数

    • ksla: 乐于助人技术 + 1

TOP

回复 12# ksla


    这位兄台能否介绍几个文本处理器,及怎么用的

TOP

回复 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

TOP

回复 22# ksla


    不知道你的原始数据是什么样子,也不知道你希望得到的效果是什么。猜测一行gawk应该够了。
Talk is cheap. Show me the code.
没事不要瞎扯淡,有能耐就把代码贴出来给我看。

TOP

回复 10# gawk


    原来这样的...直接再做一个代码删除...0-20会不会好点

TOP

回复 9# ksla


    那个代码是根据IP地址的特点编写的,如果要处理其它例外情况,需要根据实际的数据做调整。
Talk is cheap. Show me the code.
没事不要瞎扯淡,有能耐就把代码贴出来给我看。

TOP

回复 8# gawk


    如果有其它不是IP的字符,你的代码会出现一个值...0-20例如:#-------------------中国CN...0-20

TOP

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

代码已经更新,你再试试。
http://bbs.bathome.net/thread-38986-1-1.html#pid180838
2

评分人数

Talk is cheap. Show me the code.
没事不要瞎扯淡,有能耐就把代码贴出来给我看。

TOP

返回列表