首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用perl将基于染色体的`.bed`文件拆分为`chromosomeName.bed`

用perl将基于染色体的`.bed`文件拆分为`chromosomeName.bed`
EN

Stack Overflow用户
提问于 2015-11-04 17:24:44
回答 2查看 1.1K关注 0票数 2

我试图使用perl将一个.bed文件分割成多个基于染色体的文件。例如,我的输入文件是example.bed

代码语言:javascript
复制
chr1    12190   12227
chr1    12595   12721
chr2    876522  876688
chr2    887378  887521
...

我的理想输出是两个.bed文件:

chr1.bed 1.床

代码语言:javascript
复制
chr1    12190   12227
chr1    12595   12721

chr2.床

代码语言:javascript
复制
chr2    876522  876688
chr2    887378  887521

我知道使用awk来做这件事更容易,但我希望找到如何使用perl脚本来做到这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-04 17:39:06

您可以维护文件句柄的散列:

代码语言:javascript
复制
$ cat example.bed 
chr1 12190 12227
chr1 12595 12721
chr2 876522 876688
chr2 887378 887521

$ perl -ane '
    open $out{$F[0]}, ">", $F[0].".bed" unless $out{$F[0]}; 
    print { $out{$F[0]} } $_;
' example.bed

$ cat chr1.bed
chr1 12190 12227
chr1 12595 12721

$ cat chr2.bed
chr2 876522 876688
chr2 887378 887521

如果你有数百个不同的染色体,你可能会耗尽打开的文件句柄。在这种情况下,您必须为每一行打开追加、打印和关闭。

票数 5
EN

Stack Overflow用户

发布于 2015-11-04 19:56:20

也许有点冗长,但如果您需要对内容进行操作(排序、搜索等),则会允许灵活性。一般来说,如果数据文件适合内存,我更愿意将整个文件填充到内存中,然后从那里开始。

代码语言:javascript
复制
use strict;
use warnings;

# initialize the hash to contain the content    
my %bed;
# read the entire file into memory
# stuffing same into a hash
while(<DATA>)
{
    chomp;
    my @line = split;
    my $car = $line[0];
    my $cdr = join(' ', @line[1,-1]);
    push(@{$bed{$car}}, $cdr);
}

foreach my $k (keys %bed)
{
    # create filename
    my $fn = $k . '.txt';
    # open file for writing
    open OUT, '>', $fn or die "Cannot open $fn, $!";
    # print each element of the hash key
    foreach my $e (@{$bed{$k}}) { print OUT "$e\n"; }
    # close file`
    close OUT;
}
exit(0);    

__DATA__
chr1    12190   12227
chr1    12595   12721
chr2    876522  876688
chr2    887378  887521
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33528184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档