免费注册 查看新帖 |

Chinaunix

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

大侠们看看这个问题该怎么处理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-27 01:17 |只看该作者 |倒序浏览
本帖最后由 newfinder 于 2013-11-27 14:51 编辑

有一个文件,例如下:
VS1  A B C D A B
VS2  B A D C C D
VS3  A B A C B A
EM1  C D D C C D
EM2  A B B A D C
EM3  B A C D A B
EM4  A B A B B A
DK1  A B D C D C
DK2  B A C D C D

每两列为一个单位,我想统计一下分别含VS、EM的所有个体中第一个两列中A的频率,B的频率,C的频率,D的频率;第二个两列中A的频率,B的频率,C的频率,D的频率;第三个两列中A的频率,B的频率,C的频率,D的频率……(第四个两列……)

即最终想要的结果为:

                               VS                                                                     EM                                                  DK
first col        A: 0.5  B: 0.5  C: 0  D:0                             A: 0.375  B: 0.375  C: 0.125  D: 0.125       A: 0.5  B: 0.5  C: 0  D: 0
second col    A: 0.167  B: 0 C: 0.5 D: 0.333                    A: 0.25  B:0.25  C: 0.25  D: 0.25                A: 0  B: 0  C: 0.5  D: 0.5
third col       A: 0.333  B: 0.333  C: 0.167  D: 0.167        A:0.25  B: 0.25  C: 0.25  D: 0.25                A: 0  B: 0  C: 0.5  D: 0.5

跪求各位大侠,这样的问题用perl怎么处理呢。

论坛徽章:
13
双鱼座
日期:2013-10-23 09:30:05数据库技术版块每日发帖之星
日期:2016-04-20 06:20:00程序设计版块每日发帖之星
日期:2016-03-09 06:20:002015亚冠之塔什干火车头
日期:2015-11-02 10:07:452015亚冠之德黑兰石油
日期:2015-08-30 10:07:07数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00数据库技术版块每日发帖之星
日期:2015-08-05 06:20:002015年迎新春徽章
日期:2015-03-04 09:57:09辰龙
日期:2014-12-03 14:45:52酉鸡
日期:2014-07-23 09:46:23亥猪
日期:2014-03-13 08:46:22金牛座
日期:2014-02-11 09:36:21
2 [报告]
发表于 2013-11-27 09:22 |只看该作者
用hash搞起啊

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
3 [报告]
发表于 2013-11-27 09:24 |只看该作者
我的方法比较笨。。。。。求大侠指导,我也好好学习一下

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
4 [报告]
发表于 2013-11-27 09:25 |只看该作者
回复 2# bikong0411


    用hash知道,那你准备定义几个hash?说说你的思路

论坛徽章:
8
技术图书徽章
日期:2013-09-30 08:51:28技术图书徽章
日期:2013-12-11 09:26:39白羊座
日期:2013-12-27 15:27:13金牛座
日期:2014-01-06 09:13:05天蝎座
日期:2014-01-21 14:23:28酉鸡
日期:2014-05-09 16:51:12卯兔
日期:2014-08-11 16:49:1515-16赛季CBA联赛之八一
日期:2017-08-14 23:24:57
5 [报告]
发表于 2013-11-27 10:15 |只看该作者
本帖最后由 xiumu2280 于 2013-11-27 10:56 编辑
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my %hash_all_data;
  5. while (<DATA>) {
  6.         chomp;
  7.         my @line = split;
  8.         my ($title) = $line[0]=~/\D+/gs;
  9.         shift @line;
  10.         my $m=1;
  11.         for (my $n = 0;$n<@line ;$n=$n+2) {
  12.                 my @d = @line;
  13.                 my @data = splice (@d,$n,2);
  14.                 push @{$hash_all_data{$title}{$m}},@data;
  15.                 $m++;
  16.         }
  17. }
  18. foreach my $k (keys %hash_all_data) {
  19.         foreach my $k1 (sort {$a <=> $b} keys %{$hash_all_data{$k}}) {
  20.                 print "$k\t$k1 col\t";
  21.                 my $all_n = @{$hash_all_data{$k}{$k1}};
  22.                 my @A = grep {$_ eq "A"} @{$hash_all_data{$k}{$k1}};
  23.                 my @B = grep {$_ eq "B"} @{$hash_all_data{$k}{$k1}};
  24.                 my @C = grep {$_ eq "C"} @{$hash_all_data{$k}{$k1}};
  25.                 my @D = grep {$_ eq "D"} @{$hash_all_data{$k}{$k1}};
  26.                 my $a = @A/$all_n;
  27.                 my $b = @B/$all_n;
  28.                 my $c = @C/$all_n;
  29.                 my $d = @D/$all_n;
  30.                 print "A:$a\tB:$b\tC:$c\tD:$d\n";
  31.         }
  32. }

  33. __DATA__
  34. VS1         A B  C D  A B
  35. VS2  B A  D C  C D
  36. VS3  A B  A C  B A
  37. EM1  C D  D C  C D
  38. EM2  A B  B A  D C
  39. EM3  B A  C D  A B
  40. EM4  A B  A B  B A
  41. DK1  A B  D C  D C
  42. DK2  B A  C D  C D
复制代码

小数保留什么的自己调一下

论坛徽章:
0
6 [报告]
发表于 2013-11-27 12:22 |只看该作者
回复 5# xiumu2280
这个太牛了,必须得赞一个!


   

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
7 [报告]
发表于 2013-11-27 12:34 |只看该作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. my ( $n, $element_num );
  5. while (<DATA>) {
  6.     chomp;
  7.     my ( $_, @line ) = split /\s{2}/;
  8.     $element_num = $#line;
  9.     /([A-Z]+)/;
  10.     push @{ $n->{$1} }, [@line];
  11. }
  12. for my $key ( keys $n ) {
  13.     print $key, "\n";
  14.     for my $num ( 0 .. $element_num ) {
  15.         my $s;
  16.         my $m = { A => 0, B => 0, C => 0, D => 0 };
  17.         for my $key2 ( 0 .. $#{ $n->{$key} } ) {
  18.             $s += split " ", $n->{$key}[$key2]->[$num];
  19.             $m->{$_}++ for split " ", $n->{$key}[$key2]->[$num];
  20.         }
  21.         for ( sort keys $m ) {
  22.             my $p = sprintf "%0.3f", $m->{$_} / $s;
  23.             print " $_ $p ";
  24.         }
  25.         print "\n";
  26.     }
  27. }

  28. __DATA__
  29. VS1  A B  C D  A B
  30. VS2  B A  D C  C D
  31. VS3  A B  A C  B A
  32. EM1  C D  D C  C D
  33. EM2  A B  B A  D C
  34. EM3  B A  C D  A B
  35. EM4  A B  A B  B A
  36. DK1  A B  D C  D C
  37. DK2  B A  C D  C D
复制代码

论坛徽章:
8
技术图书徽章
日期:2013-09-30 08:51:28技术图书徽章
日期:2013-12-11 09:26:39白羊座
日期:2013-12-27 15:27:13金牛座
日期:2014-01-06 09:13:05天蝎座
日期:2014-01-21 14:23:28酉鸡
日期:2014-05-09 16:51:12卯兔
日期:2014-08-11 16:49:1515-16赛季CBA联赛之八一
日期:2017-08-14 23:24:57
8 [报告]
发表于 2013-11-27 13:29 |只看该作者
大神膜拜一个~~~!!
回复 7# 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
9 [报告]
发表于 2013-11-27 14:49 |只看该作者
  1. #!/usr/bin/perl

  2. @a = qw/A B C D/;

  3. while (<DATA>) {
  4.         $len=split;
  5.         @_[0] =~ s/\d+//;
  6.         $h1{@_[0]}++;
  7.         for ($i=2;$i<=@_;$i+=2) {
  8.                 $h2{@_[0]}{$i/2}{@_[$i-1]}++;
  9.                 $h2{@_[0]}{$i/2}{@_[$i]}++;
  10.         }
  11. }

  12. END {
  13.         foreach $k1 (keys %h1) {
  14.                 print "$k1\n";
  15.                 for ($i=1;$i<=($len-1)/2;$i++) {
  16.                         print "$i ";
  17.                         for ($j=0;$j<@a;$j++) {
  18.                                 printf "%s: %.3f ",$a[$j],$h2{$k1}{$i}{$a[$j]}/($h1{$k1}*2);
  19.                         }
  20.                         print "\n";
  21.                 }
  22.         }
  23. }

  24. __DATA__
  25. VS1  A B  C D  A B
  26. VS2  B A  D C  C D
  27. VS3  A B  A C  B A
  28. EM1  C D  D C  C D
  29. EM2  A B  B A  D C
  30. EM3  B A  C D  A B
  31. EM4  A B  A B  B A
  32. DK1  A B  D C  D C
  33. DK2  B A  C D  C D
复制代码

论坛徽章:
0
10 [报告]
发表于 2013-11-27 14:57 |只看该作者
本帖最后由 newfinder 于 2013-11-27 14:59 编辑

回复 7# mcshell
VS1  A B C D A B
VS2  B A D C C D
VS3  A B A C B A
EM1  C D D C C D
EM2  A B B A D C
EM3  B A C D A B
EM4  A B A B B A
DK1  A B D C D C
DK2  B A C D C D
大侠,如果每列之间都是用空格隔开,只在个体号与后面的字母是tab键,其他列之间全是空格键,如上面的数据,程序要怎么改就可以了呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP