亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 24987 | 回復: 3
打印 上一主題 下一主題

perl 隨機抽取文件中的一部分行 [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2018-12-22 17:25 |只看該作者 |倒序瀏覽
本帖最后由 niuguohao 于 2018-12-22 17:28 編輯

有一個基因組vcf文件,里面位點非常多(每個位點一行),現(xiàn)在想從這些位點中按照染色體上的位置,每500bp范圍內(nèi)隨機抽取一個位點出來(比如下面在scaffold1中屬于1-500位置的是前四行,然后從中抽一行,屬于501-1000的是5,6,7三行,再從中隨機抽出一行,以此類推),想了半天不知道該如何實現(xiàn)。
vcf文件格式如下(tab分隔):

scaffold1       127     .       C       T       45.23   PASS AC=2 ;AF=0.011;=-……(后面還有很多故省略)
scaffold1       167     .       G       A       696.19  PASS AC=4 ;AF=0.02 2;0.……
scaffold1       260     .       A       G       1278.59 PASS AC=23 ;AF=0.1 11;5
scaffold1       462     .       T       C       4409.63 PASS AC=49 ;AF=0.2 33;……
scaffold1       636     .       A       G       7061.50 PASS AC=45 ;AF=0.2 12;=……
scaffold1       862     .       C       T       414.11  PASS AC=7 ;AF=0.03 3;;……
scaffold2       999     .       G       A       1135.55 PASS AC=4 ;AF=0.0 1949
scaffold2       128     .       C       T       45.23   PASS AC=2 ;AF=0.011 ;AN==-……
scaffold2       167     .       G       A       696.19  PASS  AC=4 ;AF=0. 022; AN=oeff=0.
scaffold2       699     .       A       G       7061.50 PASS AC=45;  AF=0.2 12;AN;DP=……
scaffold2       888     .       C       T       414.11  PASS AC=7 ;AF= 0.03 3;AN=;……
scaffold2       997     .       G       A       1135.55 PASS AC=4 ;AF=0.01 9;AN……
……
第一列是染色體名稱 第二列是在該上染色體上的位置,后面是說明。
求助各位大神,應該如何操作呢?

論壇徽章:
12
子鼠
日期:2014-10-11 16:46:482016科比退役紀念章
日期:2018-03-16 10:24:0515-16賽季CBA聯(lián)賽之山東
日期:2017-11-10 14:32:142016科比退役紀念章
日期:2017-09-02 15:42:4715-16賽季CBA聯(lián)賽之佛山
日期:2017-08-28 17:11:5515-16賽季CBA聯(lián)賽之浙江
日期:2017-08-24 16:55:1715-16賽季CBA聯(lián)賽之青島
日期:2017-08-17 19:55:2415-16賽季CBA聯(lián)賽之天津
日期:2017-06-29 10:34:4315-16賽季CBA聯(lián)賽之四川
日期:2017-05-16 16:38:55黑曼巴
日期:2016-07-19 15:03:112015亞冠之薩濟拖拉機
日期:2015-05-22 11:38:5315-16賽季CBA聯(lián)賽之北京
日期:2019-08-13 17:30:53
2 [報告]
發(fā)表于 2018-12-23 16:14 |只看該作者
暫時先這樣。

  1. my %hash;
  2. for my $line ( <DATA> )
  3. {
  4.     next unless ( $line=~/(\w+)\s+(\w+)/ );
  5.     #next unless ( $1 eq "scaffold1" );
  6.     chomp $line;
  7.     if ( $2 > 1 and $2 <= 500 ) {
  8.         push @{$hash{ $1 }{'part1'}}, $line;
  9.     }
  10.     elsif ( $2 > 500 and $2 <= 1000 ) {
  11.         push @{$hash{ $1 }{'part2'}}, $line;
  12.     }
  13. }

  14. my $part1 = $hash{'scaffold1'}{'part1'};
  15. my $part2 = $hash{'scaffold1'}{'part2'};

  16. printf "%s\n", $part1->[rand($#{$part1}+1)];
  17. printf "%s\n", $part2->[rand($#{$part2}+1)];

  18. __DATA__
  19. scaffold1       127     .       C       T       45.23   PASS AC=2 ;AF=0.011;=-...
  20. scaffold1       167     .       G       A       696.19  PASS AC=4 ;AF=0.02 2;0....
  21. scaffold1       260     .       A       G       1278.59 PASS AC=23 ;AF=0.1 11;5
  22. scaffold1       462     .       T       C       4409.63 PASS AC=49 ;AF=0.2 33;...
  23. scaffold1       636     .       A       G       7061.50 PASS AC=45 ;AF=0.2 12;=...
  24. scaffold1       862     .       C       T       414.11  PASS AC=7 ;AF=0.03 3;;...
  25. scaffold2       999     .       G       A       1135.55 PASS AC=4 ;AF=0.0 1949
  26. scaffold2       128     .       C       T       45.23   PASS AC=2 ;AF=0.011 ;AN==-...
  27. scaffold2       167     .       G       A       696.19  PASS  AC=4 ;AF=0. 022; AN=oeff=0.
  28. scaffold2       699     .       A       G       7061.50 PASS AC=45;  AF=0.2 12;AN;DP=...
  29. scaffold2       888     .       C       T       414.11  PASS AC=7 ;AF= 0.03 3;AN=;...
  30. scaffold2       997     .       G       A       1135.55 PASS AC=4 ;AF=0.01 9;AN...
復制代碼

論壇徽章:
0
3 [報告]
發(fā)表于 2018-12-23 19:04 |只看該作者
回復 2# 523066680

多謝大神指點,但是我這個文件的第二列數(shù)字還有很多大于1000的,最大的可能有6,7位數(shù),有什么辦法改改么?

論壇徽章:
0
4 [報告]
發(fā)表于 2018-12-23 20:14 |只看該作者
本帖最后由 hztj2005 于 2018-12-28 09:39 編輯
  1. <div class="blockcode"><blockquote>
復制代碼

  1. use List::Util qw/min/;
  2. use utf8;

  3. my @datasource=(
  4. ["scaffold1","127",],
  5. ["scaffold1","167",],
  6. ["scaffold1","260",],
  7. ["scaffold1","462",],
  8. ["scaffold1","636",],
  9. ["scaffold1","862",],
  10. ["scaffold1","999",],#原數(shù)據(jù)此行scaffold2似有誤
  11. ["scaffold2","128",],
  12. ["scaffold2","167",],
  13. ["scaffold2","699",],
  14. ["scaffold2","888",],
  15. ["scaffold2","997",],
  16. );

  17. my $sumline = @datasource;#行數(shù)
  18. print $sumline."\n";;

  19. my $endstr =$datasource[$#datasource][0];
  20. if($endstr =~ /(\d+)/)
  21. {
  22.         $scasum = $1;#染色體數(shù)量
  23.         #print $scasum."\n";
  24. }

  25. srand;#要先宣告srand函數(shù),才能產(chǎn)生隨機數(shù)的效果
  26. my @onesca = ();
  27. my $scastart =0;
  28. my $scaend =0;
  29. for(my $k=1;$k<$scasum+1;$k++)
  30. {       
  31.         my $maxvalue = -1;#該染色體最大位點
  32.         for(my $j=$scastart;$j<$sumline;$j++)
  33.         {          
  34.           my $endstr2 =$datasource[$j][0];
  35.           #print "-- $endstr2\n"; #
  36.                 if($endstr2 =~ /(\d+)/)
  37.                 {
  38.                         $scaid = $1;#染色體序號
  39.                         if($scaid == $k)
  40.                         {                       
  41.                          push @onesca,$datasource[$j][1];       
  42.                          $maxvalue =$datasource[$j][1];
  43.                          $scaend = $j+1;#記錄處理下個染色體的開始行
  44.                         }else
  45.                         {
  46.                           last;                               
  47.                         }               
  48.                 }               
  49.         }       
  50.        
  51.         print "\n當前染色體最大位點:$maxvalue ||當前染色體開始行:$scastart  下個染色體的開始行:$scaend\n"; #       
  52.         if(@onesca)
  53.         {
  54.                 for(my $baseid = 0; $baseid<$maxvalue+1; $baseid=$baseid+500)
  55.           {       
  56.                           pickline($baseid);
  57.                 }               
  58.         }       
  59.         $scastart = $scaend;         
  60.         print "\n =======第 $k 個染色體處理結(jié)束========\n"; #
  61. }

  62. sub pickline
  63. {
  64.             my $baseid=shift;            
  65.             print ("當前染色體數(shù)組:@onesca\n");            
  66.             my @part500 = grep $_<$baseid+500, @onesca;
  67.             print ("500區(qū)間數(shù)組:@part500\n");          
  68.           
  69.                         my $myneed = int(rand(500)) + $baseid; #$myneed是一個0和500之間的整數(shù)
  70.                         my @diff= map{abs($_ - $myneed)} @part500;
  71.                         my $near = &min(@diff);  #差值最小,最靠近隨機數(shù)
  72.                         print "隨機數(shù)->最小差值: $myneed -> $near\n";
  73.                        
  74.                         for(my $m=$scastart;$m<$scaend;$m++)
  75.                         {
  76.                                 my $posvalue = $datasource[$m][1];
  77.                                 if(abs($posvalue-$myneed) == $near)
  78.                                 {                                       
  79.                                         print "需要的行:".$datasource[$m][0].",$posvalue\n\n";                                                                               
  80.                                 }                                                       
  81.                         }       
  82.                        
  83.                         #print "刪除染色體數(shù)組中已處理的部分;       
  84.                         while(@onesca and ($onesca[0] < ($baseid+500)))
  85.                         {
  86.                          shift @onesca; #刪除
  87.                         }
  88.                        

  89. }

  90. exit;
復制代碼


論壇徽章:
0
5 [報告]
發(fā)表于 2018-12-25 21:55 |只看該作者
回復 4# hztj2005

謝謝您!我現(xiàn)在還沒有完全看明白,稍后繼續(xù)向您請教!非常感謝~!
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP