Chinaunix首页 | 论坛 | 博客
  • 博客访问: 289110
  • 博文数量: 32
  • 博客积分: 2179
  • 博客等级: 大尉
  • 技术积分: 443
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-21 10:30
文章分类

全部博文(32)

文章存档

2014年(1)

2013年(4)

2011年(4)

2009年(11)

2008年(5)

2007年(7)

我的朋友

分类: Python/Ruby

2013-11-06 10:52:54

    朋友在群里发了一个文本处理的问题,题目如下:

点击(此处)折叠或打开

  1. # cat a.txt内容如下:
  2.     192.168.1
  3.     192.168.2
  4.     192.168.3
  5.     172.19.3
  6.     192.16.1
  7.     192.16.2
  8.     10.0.4
  9. # 点分割, 前两个字段相同, 第三个字段递增连续的,需要合并成如下结果:
  10.     192.168.1-192.168.3
  11.     172.19.3
  12.     192.16.1-192.16.2
  13.     10.0.4
    各路大侠纷出招:

    1、shell脚本实现:

    点击(此处)折叠或打开
  1. [root@GS1-241 ~]# cat a
  2. 192.168.1
  3. 192.168.2
  4. 192.168.3
  5. 172.19.3
  6. 192.16.1
  7. 192.16.2
  8. 10.0.4
  9. 192.16.29
  10. 192.16.9
  11. 192.16.99
  12. 192.16.100
  13. [root@GS1-241 ~]# bash a.sh
  14. 10.0.4
  15. 172.19.3
  16. 192.16.1-192.16.2
  17. 192.16.9
  18. 192.16.29
  19. 192.16.99-192.16.100
  20. 192.168.1-192.168.3
  21. [root@GS1-241 ~]# cat a.sh
  22. #!/bin/bash

  23. IFS='.'
  24. AB=''
  25. C=0
  26. tmp=''

  27. while read a b c
  28. do
  29.     if [[ "$AB" == "$a.$b" && $(( $C + 1)) -eq $c ]];then
  30.         tmp="$tmp $a.$b.$c"
  31.     elif [[ "$tmp" == "" ]];then
  32.         tmp="$a.$b.$c"
  33.     else
  34.         tmp="$tmp\n$a.$b.$c"
  35.     fi
  36.     AB="$a.$b"
  37.     C=$c
  38. done < <(sort -t. -k 1n -k 3n a)

  39. echo -e "$tmp" | sed -r "s/ .* | /-/g"
    2、sed实现(看哭了)

点击(此处)折叠或打开

  1. donvan ~ /tmp $ cat test_file
  2. 192.168.1
  3. 192.168.2
  4. 192.168.3
  5. 172.19.3
  6. 192.16.1
  7. 192.16.2
  8. 10.0.4
  9. donvan ~ /tmp $ cut -d '.' -f1,2 test_file |sort -u|xargs -i sed -n ':a;/{}\.[0-9]*$/{s/^/-/;$bb;N;ba;:b;};s/\n[^\n]\{1,\}$//;/^-[^-]/{s/^-//p;q};s/-//g;/^[^\n]*\n[^\n]*$/{s/\n/-/p;q};/\n.*\n/{s/\n.*\n/-/p;q}' test_file
  10. 10.0.4
  11. 172.19.3
  12. 192.16.1-192.16.2
  13. 192.168.1-192.168.3
    3、powershell大牛出招
    

    4、awk实现

点击(此处)折叠或打开

  1. sort -t. -k 1n -k 3n a.txt | awk -F. '{if(AB==$1"."$2 && C+1==$3){e=$0}else{if(e!=""){print s"-"e}else{print s}; s=$0;e=""}; AB=$1"."$2; C=$3}END{if(e!=""){print s"-"e}else{print s}}'
    5、看大伙热情高涨,我也忍不住用python实现了一下
        

点击(此处)折叠或打开

  1. >>> b = ['10.0.4', '172.19.3', '192.16.1', '192.16.2', '192.168.29', '192.168.9', '192.168.3', '192.168.4', '192.168.5']
  2. >>> c = sorted(b, key=lambda x:(".".join(x.split(".")[:-1]), int(x.split(".")[-1])))
  3. >>> a = []
  4. >>> for i in range(len(c)):
  5. ...     if not a:a.append(c[i])
  6. ...     if i != len(c) - 1:
  7. ...         if ".".join(c[i].split(".")[:-1]) == ".".join(c[i+1].split(".")[:-1]) and int(c[i].split(".")[-1])+1 == int(c[i+1].split(".")[-1]):continue
  8. ...     if a[0] != c[i]:a.append(c[i])
  9. ...     print "-".join(a)
  10. ...     a = []
  11. ...
  12. 10.0.4
  13. 172.19.3
  14. 192.16.1-192.16.2
  15. 192.168.3-192.168.5
  16. 192.168.9
  17. 192.168.29
  18. >>>



阅读(4169) | 评论(1) | 转发(0) |
0

上一篇:pymongo 使用小结

下一篇:python分析nginx日志

给主人留下些什么吧!~~

xgtiger2014-04-27 01:22:48

文明上网,理性发言...