免费注册 查看新帖 |

Chinaunix

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

如何比较数值大小 [复制链接]

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

输入文件一:
以$3(ID**)为单位的位置坐标信息,以及这个ID匹配的注释名字信息
##1.start        2.end        3.ID        4.name1        5.name2
  1. 180407449        180407525        ID_1        aa        AA
  2. 150524405        150524490        ID_2        bb        BB1
  3. 150524405        150524490        ID_2        bb        BB2
复制代码
输入文件二:
以输入文件一中$5为大单位
##1.name2        2.scort        3.+/-        4.count        5.start1        6.end1        7.name1
  1. AA        1        -        1        180366650        180366740        aa
  2. AA        1        -        2        180382500        180382606        aa
  3. AA        1        -        3        180399314        180399397        aa
  4. AA        1        -        4        180461403        180461500        aa
  5. BB1        1        +        1        150521897        150521975        bb
  6. BB1        1        +        2        150524380        150524500        bb
  7. BB1        1        +        3        150524680        150524784        bb
  8. BB2        1        +        1        150521897        150521975        bb
  9. BB2        1        +        2        150522297        150522371        bb
复制代码
输出文件:
##1.start        2.end        3.ID        4.name1        5.name2        6.pre-count        7.pre-start1        8.pre-end1        9.post-count        10.post-start1        11.post-end1
  1. 180407449        180407525        ID_1        aa        AA        3        180399314        180399397        4        180461403        180461500
  2. 150524405        150524490        ID_2        bb        BB1        1        150521897        150521975        3        150524680        150524784
  3. 150524405        150524490        ID_2        bb        BB2        2        150522297        150522371        -        -        -
复制代码
处理条件:
1)file1 $5== file2 $1
2)情况一 file1 $1 >= file2 $6 ,即,file1 start>= file2 end,  则在对file2 $4排序取最大值对应的坐标记录作为输出结果中的“pre-count        pre-start1        pre-end1”
3)情况二 file1 $2 <= file2 $5 ,即,file1 end<=file2 start,   则在对file2 $4排序取最小值对应的坐标记录作为输出结果中的“post-count        post-start1        post-end1”
4)若无法同时获得两种情况的结果 ,则outfile中使用“-”代替

论坛徽章:
0
2 [报告]
发表于 2012-05-07 14:20 |只看该作者
标题写错了吧

论坛徽章:
0
3 [报告]
发表于 2012-05-07 14:27 |只看该作者
回复 2# Cu_fans


    那应该怎么说呢,感觉就是跨文件比较一些关键字的大小,然后分类输出结果

还是。。我开始就理解错了。。。



其实输入文件一就是中间方框区间的坐标,输入文件二是周围圆圈的区间坐标,希望获得紧邻方框的前后圆圈的坐标

不知道这样解释是否容易理解一些

论坛徽章:
0
4 [报告]
发表于 2012-05-07 20:13 |只看该作者
本帖最后由 iamlimeng 于 2012-05-08 05:55 编辑

回复 1# 怿_mao44

LZ表达得不是太清晰,或许这个问题本身就很难表达!实现了一下,因不了解你的数据规律,不一定能符合你的要求:

  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

  4. my %data1;
  5. open (DATA, "data1.txt");
  6. while (<DATA>) {
  7.          chomp;
  8.          my ($start,$end,$ID,$name1,$name2) = split /\s+/;
  9.          $data1{$name2} = "$start\t$end\t$ID\t$name1";
  10. }
  11. close(DATA);

  12. my %data2;
  13. open (DATA, "data2.txt");
  14. while (<DATA>) {
  15.         chomp;
  16.         my ($name2,$scort,$plus,$count,$start1,$end1,$name1) = split /\s+/;
  17.         $data2{$name2}{$count} = "$start1\t$end1";
  18. }
  19. close(DATA);

  20. open (OUT, ">result.txt");
  21. foreach my $name2 (sort keys %data2) {
  22.         next if (!$data1{$name2});
  23.          my ($start,$end,$ID,$name1) = split(/\t/,$data1{$name2});
  24.          my $pre = "-\t-\t-";
  25.          my $post = $pre;
  26.          my $check = 0;
  27.         my @count = sort keys %{$data2{$name2}};
  28.          foreach (@count) {
  29.                 my  ($start1,$end1) = split(/\t/,$data2{$name2}{$_});
  30.                 if ($start >= $end1) {
  31.                          $pre = "$_\t$data2{$name2}{$_}";
  32.                  }
  33.                  if ($end <= $start1 && !$check) {
  34.                          $post = "$_\t$data2{$name2}{$_}";
  35.                          $check = 1;
  36.                  }
  37.          }
  38.          print OUT "$data1{$name2}\t$name2\t$pre\t$post\n";
  39. }
  40. close OUT;
复制代码
另外,如果数据量比较大,上面的代码不适合!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP