Board logo

标题: [文本处理] 如何将相同IP段中C段(第三段)为相连数的IP地址按指定格式合并输出? [打印本页]

作者: uckiss    时间: 2016-3-2 15:06     标题: 如何将相同IP段中C段(第三段)为相连数的IP地址按指定格式合并输出?

本帖最后由 pcl_test 于 2016-3-4 19:44 编辑

1.180.160.0
1.180.161.0
1.180.163.0
133.9.228.0
133.9.229.0
1.180.164.0
1.180.165.0
133.9.23.0
133.9.230.0
133.9.231.0
133.9.233.0
133.9.234.0
133.9.235.0
修改后:  
1.180.160.0-1.180.161.255
1.180.163.0-1.180.165.255
133.9.23.0-133.9.23.255
133.9.228.0-133.9.235.255
//参考下之前的,是取C段最小值和最大值生成
http://www.bathome.net/thread-31568-1-1.html
谢谢。
作者: WHY    时间: 2016-3-3 22:35

本帖最后由 WHY 于 2016-3-4 11:50 编辑

改一下,过滤掉文本重复行

基本思路:
1.取IP地址前三列,第3列加上1000,避免按字符排序出错
2.前三列存放到数组,排序
3.遍历数组,相邻两数组比较,前两列相同、第3列相差1或0则认为是连续
  1. @if (0)==(0) echo off
  2. cscript //nologo //e:jscript "%~0" < a.txt
  3. pause & exit
  4. @end
  5. var arr = WSH.StdIn.ReadAll().replace(
  6.     /^(\d+\.\d+\.)(\d+)\.0/mg,
  7.     function(a, b, c){ return b + (c*1 + 1000) }
  8. ).match(/(\d+\.){2}\d+/g);
  9. arr.sort().push('');
  10. var s = '', len = arr.length - 1;
  11. for(var i=0; i<len; i++){
  12.     var x = arr[i].split('.');
  13.     var y = arr[i+1].split('.');
  14.     if(x[0]==y[0] && x[1]==y[1] && (y[2]-x[2]==1 || y[2]-x[2]==0)){
  15.         s += x[2] + ' ' + y[2];
  16.     }else {
  17.         if(s == '') s = x[2];
  18.         var s1 = x[0] + '.' + x[1] + '.' + (s.substr(0,4) - 1000) + '.0';
  19.         var s2 = x[0] + '.' + x[1] + '.' + (s.substr(s.length-4) - 1000) + '.255';
  20.         WSH.Echo(s1 + '-' + s2);
  21.         s = ''
  22.     }
  23. }
复制代码





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