免费注册 查看新帖 |

Chinaunix

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

hash of hash [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-06 15:13 |只看该作者 |倒序浏览
本帖最后由 pony2001mx 于 2014-05-06 15:15 编辑

大家好:
我有以下数据:
at1g001  t1  m1
at1g002  t3  m2
at1g002  t3  m2
at1g002  t4  m5
.....

(注:三列为基因名、处理号和样品号。)

我需要统计唯一行的数目,然后输出样品号、处理号和相应数目。以上面数据为例,输出为:
  1.         t1        t3        t4
  2. m1        1        0        0
  3. m2        0        2        0
  4. m5        0        0        1
  5. ......
复制代码
我的脚本是:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. open FH, '<', $ARGV[0];
  5. my %h;
  6. while (<>){
  7.         my ($gene, $trea, $samp) = /(\S+?)\s+(\S+?)\s+(\S+)/;
  8.         $h{$samp}{$trea}{$gene} += 1;
  9. }

  10. foreach my $samp (sort keys %h){
  11.   print "$samp\t";  #print sample name
  12.         foreach my $trea (sort keys %{h{$samp}}){
  13.                 foreach my $gene (sort keys %{h{$samp}{$trea}}){
  14.                         if ( exists $h{$samp}{$trea}{$gene}) {  
  15.                                 print "$h{$samp}{$trea}{$gene}\t"; #if exists print number
  16.                         }else{
  17.                                 print "0\t"; #if not exists print zero
  18.                         }
  19.                 }
  20.         }
  21.         print "\n";
  22. }
复制代码
提示错误是syntax error line13,near “%{h{”, 请高手指教错误所在,谢谢!!

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
2 [报告]
发表于 2014-05-06 15:33 |只看该作者
本帖最后由 mcshell 于 2014-05-06 15:33 编辑

[code]%{h{$samp}}=>
$h{$samp}code]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
3 [报告]
发表于 2014-05-06 15:36 |只看该作者
回复 1# pony2001mx


    把 `%{h{$samp}` 换成 `%{$h{$samp}`

论坛徽章:
0
4 [报告]
发表于 2014-05-06 16:11 |只看该作者
谢谢!还有问题,输出的结果是
m1  1
m2  2
m5  1
并不是我想要的结果,请指教,谢谢!!

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
5 [报告]
发表于 2014-05-06 16:40 |只看该作者
回复 4# pony2001mx
  1. my (%h,%g);
  2. while (<DATA>){
  3.         my (undef, $trea, $samp) = split;
  4.         $h{$trea}{$samp}++;
  5.         $g{$samp}++;
  6. }
  7. print "\t" ,join "\t",sort keys %h;
  8. print "\n";
  9. for  my $trea (sort keys %h){
  10.      
  11.      for my $samp (sort keys $h{$trea}){
  12.         print $samp;
  13.         for (sort keys %g){
  14.             $h{$trea}{$_}?print "\t$h{$trea}{$samp}":print "\t0";
  15.         }
  16.         print "\n";
  17.      }
  18. }
  19. __DATA__
  20. at1g001  t1  m1
  21. at1g002  t3  m2
  22. at1g002  t3  m2
  23. at1g002  t4  m5
复制代码

论坛徽章:
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-05-06 16:49 |只看该作者
这个结果跟第一列有关系吗?

论坛徽章:
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-05-06 17:19 |只看该作者
  1. my ( %h1, %h2 );
  2. map { @_ = split; $h1{$_[2]}{$_[1]} ++; $h2{$_[1]} ++; } <DATA>;
  3. print "\t$_" for sort keys %h2;
  4. print $/;
  5. for my $k1 ( sort keys %h1 ) {
  6.         print $k1;
  7.         for my $k2 ( sort keys %h2 ) {
  8.                 printf "\t%d", $h1{$k1}{$k2};
  9.         }
  10.         print $/;
  11. }
  12. __DATA__
  13. at1g001  t1  m1
  14. at1g002  t3  m2
  15. at1g002  t3  m2
  16. at1g002  t4  m5
复制代码

论坛徽章:
0
8 [报告]
发表于 2014-05-06 23:49 |只看该作者
非常谢谢mcshell 和 yestreenstars :
你们的脚本非常好!

P S: 我在描述问题时并没有说清楚,与第一列没关系。你们的思路是正确的。

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
9 [报告]
发表于 2014-05-09 10:47 |只看该作者
思路非常好! 谢谢!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP