免费注册 查看新帖 |

Chinaunix

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

大家帮忙解决个问题,谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-21 19:18 |只看该作者 |倒序浏览
A文件:
ENST00000369829 ENSG00000213366
ENST00000598454 ENSG00000224699
ENST00000448586 ENSG00000224246
ENST00000522182 ENSG00000034677
ENST00000371910 ENSG00000160323
ENST00000491059 ENSG00000136883
ENST00000559981 ENSG00000054690
ENST00000553993 ENSG00000258905
ENST00000511269 ENSG00000196104
ENST00000522231 ENSG00000029534

B文件:
chr10   100007446       100028007       ENST00000260702 273
chr10   100011779       100016332       ENST00000433374 75
chr10   100143321       100171634       ENST00000483923 390
chr10   100143321       100174941       ENST00000370575 429
chr10   100146957       100148193       ENST00000464808 59
chr10   100154974       100155064       ENST00000408492 2
chr10   100173704       100174815       ENST00000494941 27
chr10   100173923       100174915       ENST00000462874 25
chr10   100175954       100206667       ENST00000361490 468
chr10   100175954       100206683       ENST00000325103 468
我把A文件的第一列作为hash1的keys,第二列作为hash1的value;B文件的第四列作为hash2的keys,第五列作为hash2的value,我的目的是hash2的keys用hash1的value替换,并且把对应相同hash1 value的hash2 keys进行合并,也就是相应的hash2 value相加,怎么做?我做的时候是把hash2的keys循环两次,对应的ENSG号相同就把它们的值相加,然后删除一个,但是总是会提示相加的等式中有为初始化的值,而且有1万多个keys,循环两次需要很长时间,虽然是用服务器跑的,估计也很慢。谢谢

论坛徽章:
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
2 [报告]
发表于 2013-08-21 20:04 |只看该作者
看了半天好绕····是不是意思说B文件中ENST号,有相同的? 你可以先把B文件处理下···

论坛徽章:
0
3 [报告]
发表于 2013-08-21 20:15 |只看该作者
不是,ENST号和ENSG号是关联的,一个ENST号对应一个ENSG号,但是有可能多个ENST号对应一个ENSG号,我的目的是把B中ENST号用ENSG号替换后,把ENSG号相同的整合成一个,也就是对应的value相加

论坛徽章:
0
4 [报告]
发表于 2013-08-21 20:16 |只看该作者
回复 2# xiumu2280


   
不是,ENST号和ENSG号是关联的,一个ENST号对应一个ENSG号,但是有可能多个ENST号对应一个ENSG号,我的目的是把B中ENST号用ENSG号替换后,把ENSG号相同的整合成一个,也就是对应的value相加

论坛徽章:
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-08-21 20:16 |只看该作者
本帖最后由 xiumu2280 于 2013-08-21 20:22 编辑
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. open (IN,"B");
  5. my %hash_b;
  6. while (<IN>) {
  7.         chomp;
  8.         my @line_b = split /\t/,$_;
  9.         push @{$hash_b{$line_b[3]}},$line_b[-1];
  10. }
  11. close IN;
  12. open (IN1,"A");
  13. while (<IN1>) {
  14.         chomp;
  15.         my $line = $_;
  16.         my @line_a = split /\t/,$line;
  17.         my $n = 0;
  18.         if ($hash_b{$line_a[1]}) {
  19.                 foreach my $value (@{$hash_b{$line_a[0]}}) {
  20.                         $n = $value+$n;
  21.         }
  22.                 print "$line\t$n\n";
  23.         }else{
  24.                 print "$line\n";
  25.         }
  26. }
复制代码
楼主你试试这个,我现在没有环境,这个没测试 ···
其实你低估服务器的能力了···
那这个不对了···我在写写看

论坛徽章:
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
6 [报告]
发表于 2013-08-21 20:24 |只看该作者
ENST号也是无重复的吧回复 5# jin978347005


   

论坛徽章:
0
7 [报告]
发表于 2013-08-21 20:26 |只看该作者
回复 6# xiumu2280

嗯,没有重复
   

论坛徽章:
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-08-21 20:39 |只看该作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. open (IN,"a");
  5. my %hash_a;
  6. ########取其中SG号相同的ST号的合集
  7. while (<IN>) {
  8.         chomp;
  9.         my @line_a = split /\t/,$_;
  10.         push @{$hash_a{$line_a[1]}},$line_a[0];
  11. }
  12. close IN;
  13. ########对B文件建立HASH
  14. open (IN1,"b");
  15. my %hash_b;
  16. while (<IN1>) {
  17.         chomp;
  18.         my @line_b = split /\t/,$_;
  19.         $hash_b{$line_b[-2]} = $line_b[-1];
  20. }
  21. close IN1;
  22. ########进行遍历输出
  23. foreach  my $key (keys %hash_a) {
  24.         my $n = 0;
  25.         foreach my $key1 (@{$hash_a{$key}}) {
  26.                 $n = $hash_b{$key1} + $n;
  27.         }
  28.         print "$key:$n\n";
  29. }
复制代码

论坛徽章:
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
9 [报告]
发表于 2013-08-21 21:02 |只看该作者
本帖最后由 rubyish 于 2013-08-21 17:19 编辑

试试这个:
  1. #!/usr/bin/perl
  2. open my $A, 'a';
  3. open my $B, 'b';
  4. my ( %A, %B ) = map split, <$A>;
  5. while (<$B>) {
  6.     my ( $k, $v ) = (split)[ -2, -1 ];
  7.     $B{ $A{$k} } += $v;
  8. }
  9. print join( "\t", $_, $B{$_} ) . $/ for keys %B;
复制代码
  1. a:
  2. A a
  3. B b
  4. C c
  5. D a

  6. b:
  7. 1 2 3 A 12
  8. 1 2 3 A 11
  9. 2 3 4 B 2
  10. 3 4 5 B 3
  11. 1 1 1 C 5
  12. 1 2 3 C 5
  13. 2 2 3 D 5

  14. result:
  15. a       28
  16. b       5
  17. c       10
复制代码

论坛徽章:
0
10 [报告]
发表于 2013-08-21 21:18 |只看该作者
回复 8# xiumu2280
谢谢,可以

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP