我正在尝试使用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
脚本找出如何执行此操作。
答案 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