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

时间:2015-11-04 17:24:45

标签: perl file split

我正在尝试使用perl.bed文件拆分为基于染色体的多个文件。例如,我的输入文件是example.bed

chr1    12190   12227
chr1    12595   12721
chr2    876522  876688
chr2    887378  887521
...

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

chr1.bed

chr1    12190   12227
chr1    12595   12721

chr2.bed

chr2    876522  876688
chr2    887378  887521

我知道使用awk执行此操作会更容易,但我希望能够使用perl脚本找出如何执行此操作。

2 个答案:

答案 0 :(得分:5)

您可以维护文件句柄的哈希值:

$ 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

如果您有数百种不同的色谱系统,则可能会用完打开的文件句柄。在这种情况下,您必须打开以便为每一行添加,打印和关闭。

答案 1 :(得分:1)

可能有点冗长,但如果您需要操纵(排序,搜索等)内容,则会允许灵活性。通常,如果数据文件适合内存,我更喜欢将整个文件填入内存并从那里开始。

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