免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 14485 | 回复: 60
打印 上一主题 下一主题

[文本处理] 练习题(排序合并) [复制链接]

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-01-16 11:02 |只看该作者 |倒序浏览
骚年们,我又来出题了,这题跟昨天某人发的那题类似,属于加强版。

处理前(乱序):
  1. pear    mouse107
  2. pear    mouse123
  3. pear    mouse109
  4. pear    mouse125
  5. apple   cat123
  6. pear    dog105
  7. pear    dog101
  8. apple   cat12
  9. pear    dog104
  10. apple   cat108
  11. pear    dog11
  12. apple   cat125
  13. apple   cat106
  14. pear    mouse108
  15. pear    mouse106
  16. apple   cat107
  17. pear    dog103
  18. apple   cat109
复制代码
处理后:
  1. apple: cat12,cat106-109,cat123,cat125
  2. pear: dog11,dog101,dog103-105,mouse106-109,mouse123,mouse125
复制代码
处理要求:
1.根据第一列分类,对第二列进行合并,连续的用破折号相连,不连续的用逗号隔开,按照ACSII码顺序对子类(例如pear的dog和mouse)进行排序;
2.能用纯awk或perl做出来最好。

以下是我的代码,为了不影响大家的思路,我先隐藏起来。
游客,如果您要查看本帖隐藏内容请回复

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
2 [报告]
发表于 2014-01-16 12:37 |只看该作者
本帖最后由 rdcwayx 于 2014-01-16 12:38 编辑

回复 1# yestreenstars
回复了,但我也把代码隐藏了。
游客,如果您要查看本帖隐藏内容请回复


   

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
3 [报告]
发表于 2014-01-16 12:51 |只看该作者
  1. <?php
  2. error_reporting(E_ERROR | E_WARNING | E_PARSE);
  3. function zuhe($key ,$array) {
  4.     sort($array);
  5.     $res='';
  6.     $len = count($array);
  7.     for($i=0;$i<$len;$i++)
  8.     {
  9.         if($i==0) {
  10.             $tmp=$str=$key.$array[$i];
  11.             continue;
  12.         }
  13.         if($i > 0) {
  14.             if($array[$i]==$array[$i-1]+1){
  15.                 $str=$tmp."-" . $array[$i];
  16.             }
  17.             if($array[$i]!=$array[$i-1]+1){
  18.                 $str=$str. "," .$key.$array[$i];
  19.                 $tmp = $str;
  20.             }
  21.         } } return $str; }
  22. $fp = fopen('test.txt', "r") or die("Unable to open file!");
  23. $res = array();
  24. $result ='';
  25. $num_result='';
  26. $reg='/[a-z]+/';
  27. $num_reg='/[0-9]+/';
  28. while(!feof($fp)) {
  29.     $line = fgets($fp, 1024);
  30.     $tmp = explode(" ",$line);
  31.     preg_match($reg,$tmp[count($tmp)-1],$result);
  32.     preg_match($num_reg,$tmp[count($tmp)-1],$num_result);
  33.     $res[$tmp['0']][$result['0']][] = $num_result['0'];
  34. }
  35. foreach ($res as $key => $v){
  36.     ksort($v);
  37.     $res1[$key]=$v;
  38. }
  39. foreach ($res1 as $key => $v) {
  40.     $k=1;
  41.     if($key=='')break;
  42.     echo $key.": ";
  43.     foreach ($v as $vk => $vv) {
  44.         if($k>1)echo ",";
  45.         echo zuhe($vk,$vv);
  46.         $k++;
  47.     }
  48.     echo "\n";
  49. }
复制代码
  1. [root@everIover ~]# cat test.txt
  2. pear    mouse107
  3. pear    mouse123
  4. pear    mouse109
  5. pear    mouse125
  6. apple   cat123
  7. pear    dog105
  8. pear    dog101
  9. apple   cat12
  10. pear    dog104
  11. apple   cat108
  12. pear    dog11
  13. apple   cat125
  14. apple   cat106
  15. pear    mouse108
  16. pear    mouse106
  17. apple   cat107
  18. pear    dog103
  19. apple   cat109
  20. [root@everIover ~]# php test2.php
  21. pear: dog11,dog101,dog103-105,mouse106-109,mouse123,mouse125
  22. apple: cat12,cat106-109,cat123,cat125
  23. [root@everIover ~]#
复制代码

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
4 [报告]
发表于 2014-01-16 12:53 |只看该作者
回复 1# yestreenstars
awk 处理 逻辑有点混乱,我绕过来,只好用php了,不要歧视我大php


   

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
5 [报告]
发表于 2014-01-16 12:55 |只看该作者
用php很好啊, 只要自己熟练,达到效果就可以了

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
6 [报告]
发表于 2014-01-16 13:13 |只看该作者
回复 4# 这个冬天不冷
不管是黑猫还是白猫,能抓到老鼠就是好猫

   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
7 [报告]
发表于 2014-01-16 13:46 |只看该作者
回复 2# rdcwayx
这结果貌似不太符合要求啊,不过问题不大~
  1. apple,cat12,cat106-109,cat123,cat125
  2. pear,mouse106-109,mouse123,mouse125,dog11,dog101,dog103-105
复制代码

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
8 [报告]
发表于 2014-01-16 14:51 |只看该作者
perl~~
  1. my $h;
  2. map{push @{$h->{$_->[0]}->{$_->[2]}},$_->[3]}sort{$a->[2]  cmp $b->[2]||$a->[3]<=>$b->[3]}map{[/(\w+)\s+(([a-z]+)(\d+))/]}<DATA>;
  3. map{print "$_:";my $n=$_;my @arr;map{my $tmp=join ",",@{$h->{$n}->{$_}};
  4.                              1 while($tmp =~ s#(-)?(?<!\d)(\d+),(\d+)(?(?{$3!=$2+1})(*F))#$1?"-$3":"$2-$3"#e);                       
  5.                               push @arr, "$_" . join ",$_",split/,/,"$tmp";
  6.                              }keys $h->{$n};print join ",",@arr;print "\n"}keys $h;
  7. __DATA__
  8. pear    mouse107
  9. pear    mouse123
  10. pear    mouse109
  11. pear    mouse125
  12. apple   cat123
  13. pear    dog105
  14. pear    dog101
  15. apple   cat12
  16. pear    dog104
  17. apple   cat108
  18. pear    dog11
  19. apple   cat125
  20. apple   cat106
  21. pear    mouse108
  22. pear    mouse106
  23. apple   cat107
  24. pear    dog103
  25. apple   cat109
复制代码

论坛徽章:
1
CU十四周年纪念徽章
日期:2015-12-16 18:25:16
9 [报告]
发表于 2014-01-16 15:58 |只看该作者
顺序有问题,没办法了用asort排序后就这样,不过添加了去重的功能[code][root@localhost ~]# cat 1.txt
pear    mouse107
pear    mouse123
pear    mouse109
pear    mouse125
apple   cat123
pear    dog105
pear    dog101
apple   cat12
pear    dog104
apple   cat108
pear    dog11
apple   cat125
apple   cat106
pear    mouse108
pear    mouse106
apple   cat107
pear    dog103
apple   cat109
[root@localhost ~]# awk '{   
  a[NR]=$1FS$2
}
END{
  asort(a)
  for (i=1;i<=NR;i++) {
    split(a[i],b,FS)
    if (!c[b[1]])
      c[b[1]]=b[2]","
    else {
      count=split(c[b[1]],d,",")
      match(d[count-1],/a-z+/)
      old1=substr(d[count-1],RSTART,RLENGTH)
      match(b[2],/a-z+/)
      new1=substr(b[2],RSTART,RLENGTH)
      match(d[count-1],/[0-9]+$/)
      old2=substr(d[count-1],RSTART,RLENGTH)
      match(b[2],/[0-9]+/)
      new2=substr(b[2],RSTART,RLENGTH)      
      if (old1==new1 && (old2+1)==new2||old2==new2) {
        c[b[1]]=substr(c[b[1]],1,length(c[b[1]])-1)
        sub(/-[0-9]+$/,"",c[b[1]])
        c[b[1]]=c[b[1]]"-"new2","
      }   
      else
        c[b[1]]=c[b[1]]""b[2]","
    }  
  }  
  for (i in c)
    print i":"substr(c[i],1,length(c[i])-1)
}' 1.txt
apple:cat106-109,cat12,cat123,cat125
pear:dog101,dog103-105,dog11,mouse106-109,mouse123,mouse125
[root@localhost ~]# [/code]

论坛徽章:
1
CU十四周年纪念徽章
日期:2015-12-16 18:25:16
10 [报告]
发表于 2014-01-16 15:59 |只看该作者
[code][root@localhost ~]# cat 1.txt
pear    mouse107
pear    mouse123
pear    mouse109
pear    mouse125
apple   cat123
pear    dog105
pear    dog101
apple   cat12
pear    dog104
apple   cat108
pear    dog11
apple   cat125
apple   cat106
pear    mouse108
pear    mouse106
apple   cat107
pear    dog103
apple   cat109
[root@localhost ~]# awk '{   
  a[NR]=$1FS$2
}
END{
  asort(a)
  for (i=1;i<=NR;i++) {
    split(a[i],b,FS)
    if (!c[b[1]])
      c[b[1]]=b[2]","
    else {
      count=split(c[b[1]],d,",")
      match(d[count-1],/a-z+/)
      old1=substr(d[count-1],RSTART,RLENGTH)
      match(b[2],/a-z+/)
      new1=substr(b[2],RSTART,RLENGTH)
      match(d[count-1],/[0-9]+$/)
      old2=substr(d[count-1],RSTART,RLENGTH)
      match(b[2],/[0-9]+/)
      new2=substr(b[2],RSTART,RLENGTH)      
      if (old1==new1 && (old2+1)==new2||old2==new2) {
        c[b[1]]=substr(c[b[1]],1,length(c[b[1]])-1)
        sub(/-[0-9]+$/,"",c[b[1]])
        c[b[1]]=c[b[1]]"-"new2","
      }   
      else
        c[b[1]]=c[b[1]]""b[2]","
    }  
  }  
  for (i in c)
    print i":"substr(c[i],1,length(c[i])-1)
}' 1.txt
apple:cat106-109,cat12,cat123,cat125
pear:dog101,dog103-105,dog11,mouse106-109,mouse123,mouse125
[root@localhost ~]# [/code]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP