免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: xierongzhong
打印 上一主题 下一主题

[文本处理] 纠结了好久,求大神 [复制链接]

论坛徽章:
60
20周年集字徽章-20	
日期:2020-10-28 14:04:3015-16赛季CBA联赛之北京
日期:2016-07-06 15:42:0715-16赛季CBA联赛之同曦
日期:2016-06-12 10:38:0915-16赛季CBA联赛之佛山
日期:2016-05-27 11:54:56黄金圣斗士
日期:2015-12-02 11:44:35白银圣斗士
日期:2015-11-25 14:32:43白银圣斗士
日期:2015-11-23 12:53:352015亚冠之布里斯班狮吼
日期:2015-10-21 16:55:482015亚冠之首尔
日期:2015-09-01 16:46:052015亚冠之德黑兰石油
日期:2015-08-31 11:39:192015亚冠之萨济拖拉机
日期:2015-08-28 21:06:5315-16赛季CBA联赛之广东
日期:2016-07-12 14:58:53
11 [报告]
发表于 2014-01-15 14:58 |只看该作者
回复 8# xierongzhong


    靠!  暗黑西游是 4399 开发的啊,以为是 暗黑西游记 去了!我勒个去
  1. [root@centos6-1 ~]#
  2. [root@centos6-1 ~]# cat file
  3. 神魔        S126
  4. 神魔        S125
  5. 神魔        S123
  6. 神魔        S109
  7. 神魔        S108
  8. 神魔        S107
  9. 神魔        S106
  10. 御剑        S125
  11. 御剑        S123
  12. 御剑        S109
  13. 御剑        S108
  14. 御剑        S107
  15. 御剑        S106
  16. 暗黑西游        S15
  17. 暗黑西游        S14
  18. 暗黑西游        S10
  19. 暗黑西游        S9
  20. 暗黑西游        S2
  21. [root@centos6-1 ~]#
  22. [root@centos6-1 ~]#
  23. [root@centos6-1 ~]# sort -tS -k2,2n file | awk -f f.awk
  24. 御剑 S106-109,S123,S125
  25. 神魔 S106-109,S123,S125-126
  26. 暗黑西游 S2,S9-10,S14-15
  27. [root@centos6-1 ~]#
  28. [root@centos6-1 ~]# cat f.awk
  29. #!/bin/awk

  30. { a[$1]=a[$1]?a[$1]","$2:$2 }

  31. END {
  32.         for(i in a){
  33.                 for(n=1;n<=split(a[i],b,",");n++){
  34.                         m=0
  35.                         r=substr(b[n],1,1);t=substr(b[n],2);while(r""++m+t==b[n+m])continue;
  36.                         --m;if(m!=0)b[n]=b[n]"-"m+t
  37.                         s=s?s","b[n]:b[n]
  38.                         n+=m
  39.                 }
  40.                 print i,s;s=""
  41.         }
  42. }
  43. [root@centos6-1 ~]#
复制代码

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
12 [报告]
发表于 2014-01-15 14:59 |只看该作者
回复 1# xierongzhong


try:
  1. awk -F '[ \tS]+' '{a[$1]=a[$1]?$2","a[$1]:$2}END{for(i in a){l=split(a[i],A,",");printf i"\tS"A[1];for(j=2;j<=l;j++){if(A[j]==A[j-1]+1){if(A[j]!=A[j+1]-1)printf "-S"A[j];continue;}printf ",S"A[j]}print ""}}' file
复制代码

论坛徽章:
0
13 [报告]
发表于 2014-01-15 15:22 |只看该作者
回复 12# ly5066113


    神魔    S106-S109,S123,S13,S12,S10,S125
御剑    S106-S109,S123,S125

不行
S12-S13没合并

论坛徽章:
23
15-16赛季CBA联赛之吉林
日期:2017-12-21 16:39:27白羊座
日期:2014-10-27 11:14:37申猴
日期:2014-10-23 08:36:23金牛座
日期:2014-09-30 08:26:49午马
日期:2014-09-29 09:40:16射手座
日期:2014-11-25 08:56:112015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:0315-16赛季CBA联赛之山东
日期:2017-12-21 16:39:1915-16赛季CBA联赛之广东
日期:2016-01-19 13:33:372015亚冠之山东鲁能
日期:2015-10-13 09:39:062015亚冠之西悉尼流浪者
日期:2015-09-21 08:27:57
14 [报告]
发表于 2014-01-15 15:26 |只看该作者
回复 13# tyw09


楼主的数据是严格降序排列的,你的测试数据不是。

论坛徽章:
0
15 [报告]
发表于 2014-01-15 15:46 |只看该作者
回复 14# ly5066113


#!/usr/bin/env python
# -*- coding: utf-8 -*-
#  tanyewei@gmail.com
#  2014/01/15 14:15
import sys
from itertools import *
from operator import itemgetter


def parse(filename):
    d = {}
    for line in open(filename, 'r'):
        _line = line.split()
        d.setdefault(_line[0], []).append(_line[1])

    for key in d.keys():
        data = sorted(map(lambda x: int(x[1:]), d[key]))
        sys.stdout.write(key + " ")

        for k, g in groupby(enumerate(data), lambda (i, x): i - x):
            ret = map(itemgetter(1), g)
            if len(ret) > 1:
                sys.stdout.write("S%d-%d," % (ret[0], ret[-1]))
            elif len(ret) == 1:
                sys.stdout.write(str("S%s") % ret[0] + ",")
        sys.stdout.write('\n')


if __name__ == "__main__":
    filename = sys.argv[1]
    parse(filename)


保存为1.py chmox +x 1.py
./1.py 文件名

论坛徽章:
0
16 [报告]
发表于 2014-01-15 17:22 |只看该作者
[ 本帖最后由 iamhere2007 于 2014-01-15 17:26 编辑 ]

#说明:同一类$1,$2必须递减;如果$2非递减,可以用sort -t"S" -k2nr data.txt使得$2递减
#优点:不同类$1可以混合
#the array style of prev,cont,start is for independently dealing with every category of $1
{
   if(substr(prev[$1],2)-1==substr($2,2))
   {
          if(!cont[$1])  #! includes two cases: cont[$1] is empty or 0
          {
             start[$1]=substr(prev[$1],2);
          }
          cont[$1]++;
   }
   else #when break occur,the things you need to do
   {
          if(cont[$1])
          {
              arr[$1]=arr[$1] "S" start[$1]-cont[$1] "-" start[$1] ",";
              cont[$1]=0;   #cont is not like start, you must make it zero explicitly
          }
          arr[$1]=arr[$1] $2 ",";
   }
   prev[$1]=$2;    #keep the previous $2
}
END{
      for(i in arr)
      {
          if(cont[i]>0)       #process the last continuous
          {
              arr[i]=arr[i] "S" start[i]-cont[i] "-" start[i] ",";
          }
          print i": " substr(arr[i],1,length(arr[i])-1);  #remove the last comma
      }
}

论坛徽章:
36
摩羯座
日期:2013-09-23 16:37:312015年亚洲杯之沙特阿拉伯
日期:2015-04-14 09:10:172015亚冠之柏太阳神
日期:2015-06-25 08:48:212015亚冠之武里南联
日期:2015-07-28 09:01:082015亚冠之莱赫维亚
日期:2015-07-28 15:44:172015亚冠之柏斯波利斯
日期:2015-09-06 14:08:52白银圣斗士
日期:2015-11-25 17:06:2815-16赛季CBA联赛之吉林
日期:2015-12-09 16:59:072016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之辽宁
日期:2016-04-14 09:29:04luobin
日期:2016-06-17 17:46:3615-16赛季CBA联赛之天津
日期:2016-08-16 14:11:01
17 [报告]
发表于 2014-01-15 17:39 |只看该作者
回复 8# xierongzhong
  1. sub(/-[^,]*-/,"-",a[i])
复制代码
改成这样就可以了

   

论坛徽章:
29
程序设计版块每日发帖之星
日期:2016-02-29 06:20:0015-16赛季CBA联赛之天津
日期:2016-08-10 10:33:1115-16赛季CBA联赛之深圳
日期:2016-08-17 15:07:2015-16赛季CBA联赛之佛山
日期:2016-11-07 11:33:5015-16赛季CBA联赛之广夏
日期:2016-11-15 09:13:31CU十四周年纪念徽章
日期:2016-11-24 14:12:25极客徽章
日期:2016-12-07 14:03:4015-16赛季CBA联赛之深圳
日期:2016-12-07 17:15:2715-16赛季CBA联赛之北京
日期:2016-12-22 09:30:0115-16赛季CBA联赛之深圳
日期:2016-12-22 10:49:2115-16赛季CBA联赛之山西
日期:2017-02-10 09:05:3215-16赛季CBA联赛之同曦
日期:2017-02-27 14:19:08
18 [报告]
发表于 2014-01-15 23:33 |只看该作者
  1. sort -t'S' -k2n file | awk '{sub(/^S/,"",$2);a[$1]=a[$1]?a[$1]FS$2:$2}END{for(i in a){l=split(a[i],sa);printf i":";min=sa[1];for(j=2;j<=l;++j){if(sa[j-1]+1!=sa[j]){printf "S%s,",min==sa[j-1]?min:min"-"sa[j-1];min=sa[j]}}if(min==sa[j-1])printf "S%s",sa[j-1];if(sa[j-1]-1==sa[j-2])printf "S%s-%s",min,sa[j-1];print ""}}'
复制代码
回复 1# xierongzhong


   

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
19 [报告]
发表于 2014-01-16 11:07 |只看该作者
http://bbs.chinaunix.net/thread-3620300-2-1.html
或者去我blog看,都是同样问题。

论坛徽章:
14
15-16赛季CBA联赛之辽宁
日期:2019-06-16 15:47:3515-16赛季CBA联赛之广夏
日期:2016-08-13 21:24:352015亚冠之武里南联
日期:2015-07-07 17:37:372015亚冠之萨济拖拉机
日期:2015-07-06 17:07:482015亚冠之全北现代
日期:2015-06-04 13:54:272015亚冠之城南
日期:2015-05-21 15:43:212015年亚洲杯之伊朗
日期:2015-04-25 18:20:362015年亚洲杯之伊朗
日期:2015-04-20 16:06:052015年亚洲杯之科威特
日期:2015-03-07 12:51:26丑牛
日期:2014-12-30 10:26:38申猴
日期:2014-09-28 22:40:18金牛座
日期:2014-09-13 21:12:22
20 [报告]
发表于 2014-01-18 22:57 |只看该作者
本帖最后由 reb00t 于 2014-01-19 20:41 编辑
  1. sort -k1,1 -k2,2n  -tS  123.txt |awk  -F'S' -f 1.sh
  2. 御剑            S106-109,S123,S125
  3. 暗黑西游                S2,S9-10,S14-15
  4. 神魔            S106-109,S123,S125-126
  5. ::::::::::::::
  6. 123.txt
  7. ::::::::::::::
  8. 神魔        S126
  9. 神魔        S125
  10. 神魔        S123
  11. 神魔        S109
  12. 神魔        S108
  13. 神魔        S107
  14. 神魔        S106
  15. 御剑        S125
  16. 御剑        S123
  17. 御剑        S109
  18. 御剑        S108
  19. 御剑        S107
  20. 御剑        S106
  21. 暗黑西游        S15
  22. 暗黑西游        S14
  23. 暗黑西游        S10
  24. 暗黑西游        S9
  25. 暗黑西游        S2
  26. ::::::::::::::
  27. 1.sh
  28. ::::::::::::::
  29. #!/bin/awk

  30. NR==1{p1=$1;p2=$2;s=$1"\tS"$2}NR>1{

  31.         if($1==p1){
  32.                 if($2==p2+1){
  33.                         s=s"-"$2
  34.                                         }else{
  35.                         
  36.                         s=s",S"$2}
  37.                         
  38.                         p1=$1;p2=$2
  39.         }else {
  40.                         gsub(/-[^,]*-/,"-",s);print s;
  41.                
  42.                         p1=$1;p2=$2;
  43.                         s=$1"\tS"$2
  44.                         }
  45.                         
  46.         }END{gsub(/-[^,]*-/,"-",s);
  47.         
  48.                 print s}

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP