免费注册 查看新帖 |

Chinaunix

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

请教排序问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-09-13 23:54 |只看该作者 |倒序浏览
各位大神!俺有一个文件想按第2列gene transcript exon CDS的顺序排序,exon和CDS再按照number 1234...排序,请教如何实现!谢谢各路大神!

1      BOV     gene    97712   97859   .       -       .       gene_id "bov11"; gene_name "11";
1      BOV     exon    97712   97781   .       -       1       gene_id "bov11"; gene_name "11"; exon_number "1";
1      BOV     exon    97840   97859   .       -       0       gene_id "bov11"; gene_name "11"; exon_number "2";
1      BOV     transcript      97712   97859   .       -       .       gene_id "bov11"; gene_name "11";
1      BOV     CDS     97840   97859   .       -       0       gene_id "bov11"; gene_name "11"; cds_number "2";
1      BOV     CDS     97712   97781   .       -       1       gene_id "bov11"; gene_name "11"; cds_number "1";
1      BOV     gene    98574   105035  .       +       .       gene_id "bov12"; gene_name "12";
1      BOV     exon    101963  103145  .       +       .       gene_id "bov12"; gene_name "12"; exon_number "3";
1      BOV     exon    104333  105035  .       +       0       gene_id "bov12"; gene_name "12"; exon_number "4";
1      BOV     exon    98574   98701   .       +       .       gene_id "bov12"; gene_name "12"; exon_number "1";
1      BOV     exon    99346   99497   .       +       .       gene_id "bov12"; gene_name "12"; exon_number "2";
1      BOV     transcript      98574   105035  .       +       .       gene_id "bov12"; gene_name "12";
1      BOV     CDS     102068  103145  .       +       0       gene_id "bov12"; gene_name "12"; cds_number "1";
1      BOV     CDS     104333  104895  .       +       2       gene_id "bov12"; gene_name "12"; cds_number "2";

得到:
1      BOV     gene    97712   97859   .       -       .       gene_id "bov11"; gene_name "11";
1      BOV     transcript      97712   97859   .       -       .       gene_id "bov11"; gene_name "11";
1      BOV     exon    97712   97781   .       -       1       gene_id "bov11"; gene_name "11"; exon_number "1";
1      BOV     exon    97840   97859   .       -       0       gene_id "bov11"; gene_name "11"; exon_number "2";
1      BOV     CDS     97712   97781   .       -       1       gene_id "bov11"; gene_name "11"; cds_number "1";
1      BOV     CDS     97840   97859   .       -       0       gene_id "bov11"; gene_name "11"; cds_number "2";
1      BOV     gene    98574   105035  .       +       .       gene_id "bov12"; gene_name "12";
1      BOV     transcript      98574   105035  .       +       .       gene_id "bov12"; gene_name "12";
1      BOV     exon    98574   98701   .       +       .       gene_id "bov12"; gene_name "12"; exon_number "1";
1      BOV     exon    99346   99497   .       +       .       gene_id "bov12"; gene_name "12"; exon_number "2";
1      BOV     exon    101963  103145  .       +       .       gene_id "bov12"; gene_name "12"; exon_number "3";
1      BOV     exon    104333  105035  .       +       0       gene_id "bov12"; gene_name "12"; exon_number "4";
1      BOV     CDS     102068  103145  .       +       0       gene_id "bov12"; gene_name "12"; cds_number "1";
1      BOV     CDS     104333  104895  .       +       2       gene_id "bov12"; gene_name "12"; cds_number "2";


论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
2 [报告]
发表于 2016-09-14 06:37 |只看该作者
本帖最后由 jason680 于 2016-09-14 07:19 编辑

回复 1# Eva326

  1. use strict;
  2. use warnings;

  3. my @aGen = qw/gene transcript exon CDS/;
  4. my %hNum = map { $aGen[$_] => $_+1 } (0 .. $#aGen);

  5. my @raUnsort;
  6. while(<DATA>){
  7.   next if(m/^\s*$/);
  8.   my $sLine = $_;
  9.   chomp;
  10.   s/[";]/ /g;
  11.   my @aData = split;
  12.   #                      gene_name "XX",               , xxx_number "XX"
  13.   push @raUnsort, [$sLine, $aData[11], $hNum{$aData[2]}, $aData[13]//0];
  14. }

  15. my @aSorted = map  { $_->[0] }
  16.               sort { $a->[1] <=> $b->[1] or
  17.                      $a->[2] <=> $b->[2] or
  18.                      $a->[3] <=> $b->[3]         
  19.               }  @raUnsort;
  20.            
  21. print @aSorted;
  22. __DATA__
  23. 1      BOV     gene    97712   97859   .       -       .       gene_id "bov11"; gene_name "11";
  24. 1      BOV     exon    97712   97781   .       -       1       gene_id "bov11"; gene_name "11"; exon_number "1";
  25. 1      BOV     exon    97840   97859   .       -       0       gene_id "bov11"; gene_name "11"; exon_number "2";
  26. 1      BOV     transcript      97712   97859   .       -       .       gene_id "bov11"; gene_name "11";
  27. 1      BOV     CDS     97840   97859   .       -       0       gene_id "bov11"; gene_name "11"; cds_number "2";
  28. 1      BOV     CDS     97712   97781   .       -       1       gene_id "bov11"; gene_name "11"; cds_number "1";
  29. 1      BOV     gene    98574   105035  .       +       .       gene_id "bov12"; gene_name "12";
  30. 1      BOV     exon    101963  103145  .       +       .       gene_id "bov12"; gene_name "12"; exon_number "3";
  31. 1      BOV     exon    104333  105035  .       +       0       gene_id "bov12"; gene_name "12"; exon_number "4";
  32. 1      BOV     exon    98574   98701   .       +       .       gene_id "bov12"; gene_name "12"; exon_number "1";
  33. 1      BOV     exon    99346   99497   .       +       .       gene_id "bov12"; gene_name "12"; exon_number "2";
  34. 1      BOV     transcript      98574   105035  .       +       .       gene_id "bov12"; gene_name "12";
  35. 1      BOV     CDS     102068  103145  .       +       0       gene_id "bov12"; gene_name "12"; cds_number "1";
  36. 1      BOV     CDS     104333  104895  .       +       2       gene_id "bov12"; gene_name "12"; cds_number "2";

复制代码


论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
3 [报告]
发表于 2016-09-14 12:49 |只看该作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my %hSeq = do {my $pos = 0; map {$_, $pos++} qw /gene transcript exon CDS/};
  5. my @aData = ();

  6. while (<>){
  7.     my ($id) = /BOV\s+(\S+)/;
  8.     my ($pos, $sPos) = /"(\d++)"/g;
  9.     push (@{$aData[$pos % 11]}, [$_, $hSeq{$id}, $sPos // 0]);
  10. }

  11. for (@aData){
  12.     my @aGroup = map {$_->[0]} sort {$a->[1] <=> $b->[1] or $a->[-1] <=> $b->[-1]} @$_;
  13.     print @aGroup;
  14. }
复制代码

perl abc.pl a
------------------------------------------------------
1      BOV     gene    97712   97859   .       -       .       gene_id "bov11"; gene_name "11";
1      BOV     transcript      97712   97859   .       -       .       gene_id "bov11"; gene_name "11";
1      BOV     exon    97712   97781   .       -       1       gene_id "bov11"; gene_name "11"; exon_number "1";
1      BOV     exon    97840   97859   .       -       0       gene_id "bov11"; gene_name "11"; exon_number "2";
1      BOV     CDS     97712   97781   .       -       1       gene_id "bov11"; gene_name "11"; cds_number "1";
1      BOV     CDS     97840   97859   .       -       0       gene_id "bov11"; gene_name "11"; cds_number "2";
1      BOV     gene    98574   105035  .       +       .       gene_id "bov12"; gene_name "12";
1      BOV     transcript      98574   105035  .       +       .       gene_id "bov12"; gene_name "12";
1      BOV     exon    98574   98701   .       +       .       gene_id "bov12"; gene_name "12"; exon_number "1";
1      BOV     exon    99346   99497   .       +       .       gene_id "bov12"; gene_name "12"; exon_number "2";
1      BOV     exon    101963  103145  .       +       .       gene_id "bov12"; gene_name "12"; exon_number "3";
1      BOV     exon    104333  105035  .       +       0       gene_id "bov12"; gene_name "12"; exon_number "4";
1      BOV     CDS     102068  103145  .       +       0       gene_id "bov12"; gene_name "12"; cds_number "1";
1      BOV     CDS     104333  104895  .       +       2       gene_id "bov12"; gene_name "12"; cds_number "2";

论坛徽章:
0
4 [报告]
发表于 2016-09-15 20:30 |只看该作者
回复 2# jason680

请问代码第15行:$aData[13]//0];
                       这里的 //0 是什么意思呢?

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
5 [报告]
发表于 2016-09-15 20:41 |只看该作者
回复 4# Eva326

There you are ...

operator and search //

$ perldoc perlop
NAME
    perlop - Perl operators and precedence

DESCRIPTIONESC
  Operator Precedence and Associativity
    Operator precedence and associativity work in Perl more or less like they
    do in mathematics.

  ...

  C-style Logical Defined-Or
    Although it has no direct equivalent in C, Perl's "//" operator is related
    to its C-style or. In fact, it's exactly the same as "||", except that it
    tests the left hand side's definedness instead of its truth. Thus, "$a //
    $b" is similar to "defined($a) || $b" (except that it returns the value of
    $a rather than the value of "defined($a)")
and yields the same result as
    "defined($a) ? $a : $b" (except that the ternary-operator form can be used
    as a lvalue, while "$a // $b" cannot). This is very useful for providing
    default values for variables. If you actually want to test if at least one
    of $a and $b is defined, use "defined($a // $b)".

    The "||", "//" and "&&" operators return the last value evaluated (unlike
    C's "||" and "&&", which return 0 or 1). Thus, a reasonably portable way
    to find out the home directory might be:

        $home =  $ENV{HOME}
              // $ENV{LOGDIR}
              // (getpwuid($<))[7]
              // die "You're homeless!\n";

    In particular, this means that you shouldn't use this for selecting
    between two aggregates for assignment:

        @a = @b || @c;              # this is wrong
        @a = scalar(@b) || @c;      # really meant this
        @a = @b ? @b : @c;          # this works fine, though

     ...

论坛徽章:
0
6 [报告]
发表于 2016-09-15 21:19 |只看该作者
本帖最后由 Eva326 于 2016-09-15 22:42 编辑

回复 5# jason680

谢谢大神!

有的文本gene_name是一串字符,请教如何排序?
我的思路是对字符里第一串数字排序,再排第二串数字,不知道咋实现...

#                      gene_name "XX",               , xxx_number "XX"
  push @raUnsort, [$sLine, $aData[11], $hNum{$aData[2]}, $aData[13]//0];


1      BOV     gene    97712   97859   .       -       .       gene_id "bov11"; gene_name "bov01b011";
1      BOV     exon    97712   97781   .       -       1       gene_id "bov11"; gene_name "bov01b011"; exon_number "1";
1      BOV     exon    97840   97859   .       -       0       gene_id "bov11"; gene_name "bov01b011"; exon_number "2";
1      BOV     transcript      97712   97859   .       -       .       gene_id "bov11"; gene_name "bov01b011";
1      BOV     CDS     97840   97859   .       -       0       gene_id "bov11"; gene_name "bov01b011"; cds_number "2";
1      BOV     CDS     97712   97781   .       -       1       gene_id "bov11"; gene_name "bov01b011"; cds_number "1";
1      BOV     gene    98574   105035  .       +       .       gene_id "bov12"; gene_name "bov01b012";
1      BOV     exon    101963  103145  .       +       .       gene_id "bov12"; gene_name "bov01b012"; exon_number "3";
1      BOV     exon    104333  105035  .       +       0       gene_id "bov12"; gene_name "bov01b012"; exon_number "4";
1      BOV     exon    98574   98701   .       +       .       gene_id "bov12"; gene_name "bov01b012"; exon_number "1";
1      BOV     exon    99346   99497   .       +       .       gene_id "bov12"; gene_name "bov01b012"; exon_number "2";
1      BOV     transcript      98574   105035  .       +       .       gene_id "bov12"; gene_name "bov01b012";
1      BOV     CDS     102068  103145  .       +       0       gene_id "bov12"; gene_name "bov01b012"; cds_number "1";
1      BOV     CDS     104333  104895  .       +       2       gene_id "bov12"; gene_name "bov01b012"; cds_number "2";
1      BOV     gene    97712   97859   .       -       .       gene_id "bov11"; gene_name "bov02b011";
1      BOV     exon    97712   97781   .       -       1       gene_id "bov11"; gene_name "bov02b011"; exon_number "1";
1      BOV     exon    97840   97859   .       -       0       gene_id "bov11"; gene_name "bov02b011"; exon_number "2";
1      BOV     transcript      97712   97859   .       -       .       gene_id "bov11"; gene_name "bov01b012";
1      BOV     CDS     97840   97859   .       -       0       gene_id "bov11"; gene_name "bov02b011"; cds_number "2";
1      BOV     CDS     97712   97781   .       -       1       gene_id "bov11"; gene_name "bov02b011"; cds_number "1";

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
7 [报告]
发表于 2016-09-15 21:23 |只看该作者

There is an another way to sort data with small block and simple way ...

use strict;
use warnings;

my @aGen = qw/gene transcript exon CDS/;
my %hNum = map { $aGen[$_] => $_+1 . "0000" } (0 .. $#aGen);

my %hData = ();
my $sID = "";
my @aSorted;
while(<DATA> ){
  next if(m/^\s*$/);
  my $sLine = $_;
  chomp;
  s/[";]/ /g;

  my @aData = split;
  if($aData[11] ne $sID){
    if($sID ne ""){
      push @aSorted, map{ $hData{$_} } sort keys %hData;
    }
    %hData = ();
  }

  #  hash key 1xxxx for gene, 2xxxx for transcript
  #                3xxxx for exon, 4xxxx for CDS
  #  Note: easily to sort

  my $sNum = $hNum{$aData[2]} + ($aData[13]//0);
  $hData{$sNum} = ($hData{$sNum}//"") . $sLine;
  $sID = $aData[11];
}
push @aSorted, map{ $hData{$_} } sort keys %hData;
print @aSorted;


论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
8 [报告]
发表于 2016-09-15 21:30 |只看该作者
本帖最后由 jason680 于 2016-09-15 21:31 编辑

回复 6# Eva326

请给“正确”文本,别乱改...

gene_idgene_name 不匹配?

1      BOV     gene    97712   97859   .       -       .       gene_id "bov11"; gene_name "bov01b011";
1      BOV     exon    97712   97781   .       -       1       gene_id "bov11"; gene_name "bov01b011"; exon_number "1";
1      BOV     exon    97840   97859   .       -       0       gene_id "bov11"; gene_name "bov01b011"; exon_number "2";
1      BOV     transcript      97712   97859   .       -       .       gene_id "bov11"; gene_name "11";

论坛徽章:
0
9 [报告]
发表于 2016-09-15 22:48 |只看该作者
回复 8# jason680

抱歉,改好啦,刚才眼花了没改对。谢谢大神!

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
10 [报告]
发表于 2016-09-15 22:58 |只看该作者
回复 9# Eva326

试试7楼的...

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP