免费注册 查看新帖 |

Chinaunix

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

求助!列内部区间的个数统计 [复制链接]

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

例如表 t 的数据如下:

ChrID   d1   d2   d3   d4   d5  d6
Chr1:1     A    B     A    C     N   A
Chr1:2     -    C     N    B     A   N
Chr1:5     B    -     -     -     N   A
Chr1:8     C    -     B    A     B   A
Chr1:10     A    -     -    N    A   C
Chr1:15     -    B     A    C     N   A
Chr1:16     A    C     N    B     A   N
Chr1:19     -    N     N    B     N   A
Chr1:22     C    -     B    -     A   B
Chr1:23     -    N     B    N    C   C
Chr1:25     A    -     A    -     N   A
Chr1:26     A    C     N    -     A   -
Chr1:27     B    N     C    -     -   A
Chr1:28     A    A     B    A     -   B
Chr1:29     A    C     B    N    C   C

Chr2:1     A    B     A    C     N   A
Chr2:2     -    C     N    B     A   N
Chr2:3     B    -     -     -     N   A
Chr2:5     C    -     B    A     B   A
Chr2:7     A    -     -    N    A   C
Chr2:10     -    B     A    C     N   A


表中 只有 A  B  C  N -   5种值
需要查出 表t中   分别求出每列的 A B C N在每个Chr的每10区间的个数?Chr的总数和所有总数

分别找 A B C N

例如结果如下:
  找A的区间个数和总数
A.txt
site        d1   d2   d3    d4   d5    d6
Chr1:1-10       2     0     1      1     2     3
Chr1:10-20     1     0     1      0     1     2
Chr1:20-30     4     1     1      1     2     2
Chr2:1-10     2     0     2      1     2     4


Chr1total     7     1     3      2     5     7
Chr2total     2     0     2      1     2     4
totalA          9     1     5      3     7     11


B.txt


C.txt


N.txt










论坛徽章:
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 [报告]
发表于 2017-04-05 14:58 |只看该作者
回复 1# summeraing

  1. $ perl gen_ABCN.pl
  2. Usage  : gen_ABCN.pl Table_file
  3. Example: gen_ABCN.pl t.txt

  4. === table file ===
  5. ChrID     d1   d2    d3   d4    d5  d6
  6. Chr1:1     A    B     A    C     N   A
  7. Chr1:2     -    C     N    B     A   N
  8. ...


  9. $ perl gen_ABCN.pl t.txt
  10. Output file: A.txt
  11. Output file: B.txt
  12. Output file: C.txt
  13. Output file: N.txt
复制代码


  1. $ grep '.*' {A,B,C,N}.txt
  2. A.txt:site             d1    d2    d3    d4    d5    d6
  3. A.txt:Chr1:01-10        2     0     1     1     2     2
  4. A.txt:Chr1:11-20        1     0     1     0     1     2
  5. A.txt:Chr1:21-30        4     1     1     1     2     2
  6. A.txt:Chr2:01-10        2     0     2     1     2     4
  7. A.txt:
  8. A.txt:Chr1total         7     1     3     2     5     6
  9. A.txt:Chr2total         2     0     2     1     2     4
  10. A.txt:totalA            9     1     5     3     7    10
  11. B.txt:site             d1    d2    d3    d4    d5    d6
  12. B.txt:Chr1:01-10        0     1     1     1     1     0
  13. B.txt:Chr1:11-20        0     1     0     2     0     0
  14. B.txt:Chr1:21-30        1     0     4     0     0     2
  15. B.txt:Chr2:01-10        1     2     1     1     1     0
  16. B.txt:
  17. B.txt:Chr1total         1     2     5     3     1     2
  18. B.txt:Chr2total         1     2     1     1     1     0
  19. B.txt:totalB            2     4     6     4     2     2
  20. C.txt:site             d1    d2    d3    d4    d5    d6
  21. C.txt:Chr1:01-10        1     1     0     1     0     1
  22. C.txt:Chr1:11-20        0     1     0     1     0     0
  23. C.txt:Chr1:21-30        1     2     1     0     2     2
  24. C.txt:Chr2:01-10        1     1     0     2     0     1
  25. C.txt:
  26. C.txt:Chr1total         2     4     1     2     2     3
  27. C.txt:Chr2total         1     1     0     2     0     1
  28. C.txt:totalC            3     5     1     4     2     4
  29. N.txt:site             d1    d2    d3    d4    d5    d6
  30. N.txt:Chr1:01-10        0     0     1     1     1     1
  31. N.txt:Chr1:11-20        0     1     2     0     2     1
  32. N.txt:Chr1:21-30        0     2     1     2     1     0
  33. N.txt:Chr2:01-10        0     0     1     1     3     1
  34. N.txt:
  35. N.txt:Chr1total         0     3     4     3     4     2
  36. N.txt:Chr2total         0     0     1     1     3     1
  37. N.txt:totalN            0     3     5     4     7     3
复制代码



$ cat gen_ABCN.pl

  1. use strict;
  2. use warnings;

  3. my $sFile_display = 0;
  4. my $sItem_check = 1;
  5. my @aItem = qw(A B C N -);
  6. my %hItem = map {$_ => 1} @aItem;

  7. my @aHead;
  8. my %hChr;
  9. my $sHead;


  10. sub usage{
  11.   print <<__USAGE__;
  12. Usage  : $0 Table_file
  13. Example: $0 t.txt

  14. === table file ===
  15. ChrID     d1   d2    d3   d4    d5  d6
  16. Chr1:1     A    B     A    C     N   A
  17. Chr1:2     -    C     N    B     A   N
  18. ...

  19. __USAGE__
  20.   exit 1;
  21. }

  22. usage() if(@ARGV == 0);

  23. my $sCnt_head = 0;
  24. my $sCnt = 0;
  25. my $sLen = 0;
  26. while(<>){
  27.   ++$sCnt;
  28.   chomp;
  29.   my $sLine = $_;
  30.   s/^\s+|\s$//g;
  31.   next if(m/^(#|$)/);

  32.   # ChrID   d1   d2   d3   d4   d5  d6
  33.   # Chr1:1   A    B    A    C    N   A
  34.   my($sChr_num, @aData) = split;
  35.   if(m/^ChrID\s/){
  36.     @aHead  = @aData;
  37.     $sLen  = scalar @aHead;
  38.     $sHead = $sLine;
  39.     $sCnt_head = $sCnt;
  40.     next;
  41.   }
  42.   die "*** error: Cannot get 'ChrID' header\n" if($sLen == 0);
  43.   if(scalar @aData != $sLen){
  44.     print "*** error *** Line[$sCnt]: get wrong items number\n";
  45.     printf("  Line[%03d]: $sHead\n",$sCnt_head);
  46.     printf("  Line[%03d]: $sLine\n",$sCnt);
  47.     # exit 1;
  48.   }

  49.   # Chr1:1   A    B    A    C    N   A
  50.   #   Chr1 :  1
  51.   my($sChr, $sNum) = split(/:/, $sChr_num);
  52.   # @aData =  A    B    A    C    N   A
  53.   foreach(0 .. $#aData){
  54.     my $sItem = $aData[$_];
  55.     if($sItem_check != 0 && (! exists $hItem{$sItem})){
  56.       print "*** error *** Line[$sCnt]: get wrong item '$sItem'\n";
  57.       print "  check items: @aItem\n";
  58.       printf("  Line[%03d]: $sLine\n", $sCnt);
  59.       # exit 1;
  60.     }
  61.     # for initial value (0)
  62.     if(! exists $hChr{$sItem}{"Total"}{$sChr}){
  63.       @{$hChr{$sItem}{"Total"}{$sChr}} = (0) x $sLen;
  64.     }
  65.     if(! exists $hChr{$sItem}{"Number"}{$sChr}{int(($sNum-1)/10)}){
  66.       @{$hChr{$sItem}{"Number"}{$sChr}{int(($sNum-1)/10)}} = (0) x $sLen;
  67.     }
  68.     if(! exists $hChr{$sItem}{"All"}){
  69.       @{$hChr{$sItem}{"All"}} = (0) x $sLen;
  70.     }
  71.     # for Chr1:1-10, Chr2:11-20, ...
  72.     ++$hChr{$sItem}{"Number"}{$sChr}{int(($sNum-1)/10)}[$_];
  73.     # for Chr1total, Chr2total
  74.     ++$hChr{$sItem}{"Total"}{$sChr}[$_];
  75.     # for totalA, totalB, ...
  76.     ++$hChr{$sItem}{"All"}[$_];
  77.   }  
  78. }

  79. my $sFmt = "%-12s " . (" %5s" x @aHead) . "\n";
  80. foreach my $sItem(sort keys %hChr){
  81.   next if($sItem eq "-");
  82.   # for head, site  d1   d2   d3    d4   d5    d6
  83.   my $sOut = sprintf($sFmt, "site", @aHead);
  84.   foreach my $sChr(sort keys %{$hChr{$sItem}{"Number"}}){
  85.     my $rhChr = $hChr{$sItem}{"Number"}{$sChr};
  86.     # for Chr1:01-10 2 0 1 1 2 3
  87.     # for Chr1:11-20 1 0 1 0 1 2
  88.     foreach(sort{ $a<=>$b } keys %{$rhChr}){
  89.       #    Chr1:01-10  <==     Chr1: 01 - 10
  90.       my $sChr_num = sprintf("$sChr:%02d-%02d",$_*10+1,$_*10+10);
  91.       $sOut .= sprintf($sFmt, $sChr_num, @{$rhChr->{$_}});
  92.     }
  93.   }
  94.   $sOut .= "\n";
  95.   # for Chr1total 7 1 3 2 5 7
  96.   # for Chr2total ...
  97.   foreach my $sChr(sort keys %{$hChr{$sItem}{"Total"}}){
  98.     $sOut .= sprintf($sFmt, "${sChr}total", @{$hChr{$sItem}{"Total"}{$sChr}});
  99.   }
  100.   # for totalA ..., totalB ..., ...
  101.   $sOut .= sprintf($sFmt, "total$sItem", @{$hChr{$sItem}{"All"}});

  102.   # output file
  103.   my $sFout = "$sItem.txt";
  104.   open(my $FHout, ">", $sFout) or die "cannot open $sFout file\n";
  105.   print {$FHout} $sOut;
  106.   close $FHout;
  107.   print "Output file: $sFout\n";
  108.   print $sOut if($sFile_display);
  109.   
  110. }
复制代码



论坛徽章:
0
3 [报告]
发表于 2017-04-06 03:45 |只看该作者
回复 2# jason680

太感谢大神,完全满足我的格式,完美!~!

献上膝盖和打赏!~~~!

论坛徽章:
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
4 [报告]
发表于 2017-04-06 04:52 |只看该作者
本帖最后由 rubyish 于 2017-04-06 00:58 编辑

perl abc.pl data.txt

  1. #!/usr/bin/perl -w
  2. use 5.010;

  3. my $data = $ARGV[0] || 'data.txt';
  4. open my $DATA, $data or die;

  5. my ( $site, $tot, $X ) = qw[site total -];
  6. my ( undef, @D ) = split /\s+/, <$DATA>;
  7. my @O = (0) x @D;
  8. my ( %CHR, %TOT, %TAL );

  9. while (<$DATA>) {
  10.     my ( $chri, @d ) = split;
  11.     my ( $chr, $i ) = split ':', $chri;
  12.     my $I = int( ( $i - 1 ) / 10 );
  13.    
  14.     for my $i ( 0 .. $#d ) {
  15.         next if $d[$i] eq $X;
  16.         
  17.         $CHR{ $d[$i] }{$chr}[$I] //= [@O];
  18.         $TOT{ $d[$i] }{$chr}     //= [@O];
  19.         $TAL{ $d[$i] }           //= [@O];

  20.         $CHR{ $d[$i] }{$chr}[$I][$i]++;
  21.         $TOT{ $d[$i] }{$chr}[$i]++;
  22.         $TAL{ $d[$i] }[$i]++;

  23.     }
  24. }

  25. my ( undef, $K ) = %TOT;
  26. my @ORD =
  27.   map  { $_->[1] }
  28.   sort { $a->[0] <=> $b->[0] }
  29.   map  { [ /(\d+)/, $_ ] } keys %$K;

  30. $site = join "\t", $site, @D;

  31. while ( my ( $C, $V ) = each %CHR ) {
  32.     open my $file, '>', $C . '.txt' or die;
  33.     say STDERR "write\t$C.txt";
  34.     say $file $site;
  35.    
  36.     for my $c (@ORD) {
  37.         my @range = ( 1, '-', 10 );
  38.         
  39.         for my $d ( @{ $V->{$c} } ) {
  40.             if ($d) {
  41.                 my $head = $c . ':' . join( '', @range );
  42.                 say $file join "\t", $head, @$d;
  43.             }
  44.             @range[ 0, -1 ] = ( $range[-1], $range[-1] + 10 );
  45.         }
  46.     }
  47.     say $file "\n";

  48.     for my $chr (@ORD) {
  49.         say $file join "\t", $chr . $tot, @{ $TOT{$C}{$chr} };
  50.     }
  51.    
  52.     say $file join "\t", $tot . $C, @{ $TAL{$C} };
  53.     close $file;
  54. }

  55. say STDERR 'OK';

  56. __DATA__
  57. $_
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP