2015-11-04 89 views
1

我試圖用perl.bed文件拆分成基於染色體的多個文件。例如,我的輸入文件是example.bed將基於染色體的`.bed`文件拆分成`chromosomeName.bed`與perl

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

而我的理想輸出是二.bed文件:

chr1.bed

chr2.bed

chr2 876522 876688 
chr2 887378 887521 

我知道使用awk來做到這一點更容易,但我希望找出如何使用perl腳本來做到這一點。

回答

4

您可以維護文件句柄的哈希:

$ 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 

如果你有數百種不同chromasomes的,你可能會耗盡文件句柄開放的。在這種情況下,你必須打開追加,打印和關閉每一行。

+0

而且,是的,這個awk是相當的,但更簡單:'awk'{f = $ 1「.bed」; print> f}'example.bed' –

+0

非常感謝Glenn!它工作得很好。 – Renee

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 
+0

非常感謝,user1483288!這非常有幫助! – Renee