免费注册 查看新帖 |

Chinaunix

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

重发求助!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-12 21:20 |只看该作者 |倒序浏览
小弟之前发过一个,但似乎没有表达清楚自己的意思,现想重新发一下求助,原始数据:

   name1 name2 name3 name4 name5
MG1 A G C D C A C G A D
MG2 A G D C A C G C D A
SH_1 G G C C C C 0 0 A A
SH_2 A A 0 0 A A C C D D
SH_3 G A D D 0 0 G G 0 0
SD1 A G C D C C C G A D
SD2 0 0 D C C A C C D A

name1、name2、name3分别对应2列,并以空格隔开。现想统计一下以MG、SH、SD开头的分别含字母的个数,并转化一下格式,
字母里只有ACDG这4种字母,每两列只含其中的两种,但不一定是哪两种,是随机给出的,
最终想得到下面的结果:

      MG SH SD
name1 2,2 3,3 1,1 #(A的个数,G的个数)
name2 2,2 2,2 2,2 #(C的个数,D的个数)
name3 2,2 2,2 1,3 #(A的个数,C的个数)
name4 2,2 2,2 3,1 #(C的个数,G的个数)
name5 2,2 2,2 2,2 #(A的个数,D的个数)


不知道应该怎么写呢,肯请大家指点一下。

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
2 [报告]
发表于 2013-12-13 00:24 |只看该作者
biru:
  1. #!/usr/bin/perl
  2. use 5.018;
  3. my @intention = qw[ A G   C D   A C   C G   A D ];
  4. my ( @titles, %data, %filter );
  5. my @name = <DATA> =~ /\S+/g;
  6. $filter{$_} = [ splice @intention, 0, 2 ] for @name;

  7. while (<DATA>) {
  8.     my ( $title, $data ) = /^([^\d_]+)\S*\s*(.*)$/;
  9.     my @data = split /\s+/, $data;
  10.     push @titles, $title if !@titles || $titles[-1] ne $title;
  11.     for my $n (@name) {
  12.         $data{$n}{$title}{$_}++ for splice @data, 0, 2;
  13.     }
  14. }

  15. say join "\t", '', @titles;
  16. for my $n (@name) {
  17.     say join "\t", $n, map {
  18.         my $t = $_;
  19.         join ', ', map { $data{$n}{$t}{$_} || 0 } @{ $filter{$n} };
  20.     } @titles;
  21. }

  22. __DATA__
  23.    name1 name2 name3 name4 name5
  24. MG1 A G C D C A C G A D
  25. MG2 A G D C A C G C D A
  26. SH_1 G G C C C C 0 0 A A
  27. SH_2 A A 0 0 A A C C D D
  28. SH_3 G A D D 0 0 G G 0 0
  29. SD1 A G C D C C C G A D
  30. SD2 0 0 D C C A C C D A
复制代码
  1.         MG      SH      SD
  2. name1   2, 2    3, 3    1, 1
  3. name2   2, 2    2, 2    2, 2
  4. name3   2, 2    2, 2    1, 3
  5. name4   2, 2    2, 2    3, 1
  6. name5   2, 2    2, 2    2, 2
复制代码

论坛徽章:
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
3 [报告]
发表于 2013-12-13 14:41 |只看该作者

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
4 [报告]
发表于 2013-12-13 14:50 |只看该作者
本帖最后由 mcshell 于 2013-12-13 14:52 编辑
  1. my ( $h, $k );
  2. my @letter = qw/A C D G/;
  3. my @name = split " ", <DATA>;
  4. while (<DATA>) {
  5.     /([A-Z]+)_?\d+\s+(.*)$/;
  6.     @_ = split " ", $2;
  7.     push @{ $h->{$1} }, [@_];
  8. }
  9. print "\t", join " ", ( sort keys $h ), "\n";
  10. for my $key ( sort keys %$h ) {
  11.     my $g;
  12.     for my $m ( @{ $h->{$key} } ) {
  13.         for my $i ( 1 .. $#$m +1 / 2 ) {
  14.             $g->{$i}{$_}++ for splice @$m, 0, 2;
  15.         }
  16.     }
  17.     for my $key ( sort { $a cmp $b } keys %$g ) {
  18.         delete $g->{$key}{0} if $g->{$key}{0};
  19.         for (@letter) {
  20.             push @{ $k->{$key} }, $g->{$key}{$_} if $g->{$key}{$_};
  21.         }
  22.     }
  23. }
  24. for my $key ( sort keys %$k ) {
  25.     print "name$key ";
  26.     print " ",join ",", splice @{$k->{$key}}, 0, 2 for 0 .. $#{$k->{$key}} / 2;
  27.     print "\n";
  28. }
  29. __DATA__
  30. name1 name2 name3 name4 name5
  31. MG1 A G C D C A C G A D
  32. MG2 A G D C A C G C D A
  33. SH_1 G G C C C C 0 0 A A
  34. SH_2 A A 0 0 A A C C D D
  35. SH_3 G A D D 0 0 G G 0 0
  36. SD1 A G C D C C C G A D
  37. SD2 0 0 D C C A C C D A
复制代码

论坛徽章:
0
5 [报告]
发表于 2013-12-14 17:29 |只看该作者
回复 3# reyleon

大神有心了,竟把这个作为一个帖子集思,多谢多谢!
   

论坛徽章:
0
6 [报告]
发表于 2013-12-14 17:30 |只看该作者
回复 4# mcshell

恩,对对,这个就是我想要的结果,真的好难表达明白,谢谢大侠了!!
   

论坛徽章:
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 [报告]
发表于 2013-12-15 00:54 |只看该作者
  1. #!/usr/bin/perl
  2. use 5.010;

  3. my(@names, @lines, %times, @heads, %hash, $str, $temp, $value);
  4. my @letters = qw/A C D G/;

  5. while (<DATA>) {
  6.         if ( $. < 2 ) {
  7.                 @names = split;
  8.         } else {
  9.                 @lines = split;
  10.                 $lines[0] =~ s/[^A-Z]+//;
  11.                 push @heads, $lines[0] if ! $times{$lines[0]}++;
  12.                 $hash{int(($_-1)/2)}{$lines[0]}{$lines[$_]}++ for 1 .. $#lines;
  13.         }
  14. }

  15. END {
  16.         $str .= "\t" . $heads[$_] for 0 .. $#heads;
  17.         say $str;
  18.         undef $str;
  19.         for my $i ( 0 .. $#names ) {
  20.                 printf "%s\t", $names[$i];
  21.                 for my $j ( 0 .. $#heads ) {
  22.                         for my $k ( 0 .. $#letters ) {
  23.                                 $value = $hash{$i}{$heads[$j]}{$letters[$k]};
  24.                                 $temp = $temp ? $temp . "," . $value : $value if $value;
  25.                         }
  26.                         $str = $str ? $str . "\t" . $temp : $temp;
  27.                         undef $temp;
  28.                 }
  29.                 say $str;
  30.                 undef $str;
  31.         }
  32. }

  33. __DATA__
  34.    name1 name2 name3 name4 name5
  35. MG1 A G C D C A C G A D
  36. MG2 A G D C A C G C D A
  37. SH_1 G G C C C C 0 0 A A
  38. SH_2 A A 0 0 A A C C D D
  39. SH_3 G A D D 0 0 G G 0 0
  40. SD1 A G C D C C C G A D
  41. SD2 0 0 D C C A C C D A
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP