向数组散列中的文件名列表添加前缀
Adding a prefix to a list of file names in a hash of arrays
数组 @lines
包含 %hash
的键,像这样
HG00117
HG00119
NA20828
其他许多样本以此类推。我刚刚为下面的示例展示了三个。
use strict;
use warnings;
use Data::Dump;
open (FILE, 'input.txt');
chomp (my @lines = (<FILE>));
close(FILE);
my %hash;
$hash{$_} = [ glob("$_*.bam") ] for @lines;
dd %hash;
这将打印我的数组散列:
(
"HG00117",
[
"HG00117.mapped.ILLUMINA.bwa.GBR.exome.20120522.bam_herc2_data.bam",
"HG00117.mapped.ILLUMINA.bwa.GBR.low_coverage.20101123.bam_herc2_phase1.bam",
"HG00117.mapped.ILLUMINA.bwa.GBR.low_coverage.20120522.bam_herc2_data.bam",
"HG00117.mapped.illumina.mosaik.GBR.exome.20110411.bam_herc2_phase1.bam",
],
"HG00119",
[
"HG00119.mapped.ILLUMINA.bwa.GBR.exome.20120522.bam_herc2_data.bam",
"HG00119.mapped.ILLUMINA.bwa.GBR.low_coverage.20101123.bam_herc2_phase1.bam",
"HG00119.mapped.ILLUMINA.bwa.GBR.low_coverage.20120522.bam_herc2_data.bam",
"HG00119.mapped.illumina.mosaik.GBR.exome.20110411.bam_herc2_phase1.bam",
],
"NA20828",
[
"NA20828.mapped.ILLUMINA.bwa.TSI.exome.20121211.bam_herc2_data.bam",
"NA20828.mapped.ILLUMINA.bwa.TSI.low_coverage.20101123.bam_herc2_phase1.bam",
"NA20828.mapped.ILLUMINA.bwa.TSI.low_coverage.20130415.bam_herc2_data.bam",
"NA20828.mapped.illumina.mosaik.TSI.exome.20110411.bam_herc2_phase1.bam",
],
)
我想给数组的每个元素加上前缀INPUT=
,所以它们看起来像这样
(
"HG00117",
[
"INPUT=HG00117.mapped.ILLUMINA.bwa.GBR.exome.20120522.bam_herc2_data.bam",
"INPUT=HG00117.mapped.ILLUMINA.bwa.GBR.low_coverage.20101123.bam_herc2_phase1.bam",
"INPUT=HG00117.mapped.ILLUMINA.bwa.GBR.low_coverage.20120522.bam_herc2_data.bam",
"INPUT=HG00117.mapped.illumina.mosaik.GBR.exome.20110411.bam_herc2_phase1.bam",
],
"HG00119",
[
"INPUT=HG00119.mapped.ILLUMINA.bwa.GBR.exome.20120522.bam_herc2_data.bam",
"INPUT=HG00119.mapped.ILLUMINA.bwa.GBR.low_coverage.20101123.bam_herc2_phase1.bam",
"INPUT=HG00119.mapped.ILLUMINA.bwa.GBR.low_coverage.20120522.bam_herc2_data.bam",
"INPUT=HG00119.mapped.illumina.mosaik.GBR.exome.20110411.bam_herc2_phase1.bam",
],
"NA20828",
[
"INPUT=NA20828.mapped.ILLUMINA.bwa.TSI.exome.20121211.bam_herc2_data.bam",
"INPUT=NA20828.mapped.ILLUMINA.bwa.TSI.low_coverage.20101123.bam_herc2_phase1.bam",
"INPUT=NA20828.mapped.ILLUMINA.bwa.TSI.low_coverage.20130415.bam_herc2_data.bam",
"INPUT=NA20828.mapped.illumina.mosaik.TSI.exome.20110411.bam_herc2_phase1.bam",
],
)
我尝试了正则表达式和 grep
但似乎没有任何效果。我想我对 foreach
的范围感到困惑。我也尝试了 rename
功能,但它没有用。
因此,迭代每个元素 - 您实际上需要两个循环。一个用于 'top level' - 哈希值。 (这是数组引用)。
然后对于每个数组引用,在应用转换的对象中进行迭代。
foreach my $array_ref ( values %hash ) {
foreach my $oldfilename ( @$array_ref ) {
$element =~ s/^/INPUT=/;
}
}
或者您真的想更改磁盘上的文件名?如果是这样,您可以使用 rename
(不过我认为这不是您想要的)
foreach my $array_ref ( values %hash ) {
foreach my $oldfilename ( @$array_ref ) {
rename $oldfilename, 'INPUT='.$oldfilename
}
}
这可以巧妙地完成,方法是根据 input.txt
的内容构建一个正则表达式,并对照它检查所有 *.bam
个文件。
像这样
use strict;
use warnings;
my @patterns = do {
open my $in_fh, '<', 'input.txt' or die qq{Unable to open "input.txt" for input: $!};
<$in_fh>;
};
chomp @patterns;
my $re = join '|', map quotemeta, @patterns;
my @files = grep /^(?:$re)/, glob '*.bam';
$_ = "INPUT=$_" for @files;
数组 @lines
包含 %hash
的键,像这样
HG00117
HG00119
NA20828
其他许多样本以此类推。我刚刚为下面的示例展示了三个。
use strict;
use warnings;
use Data::Dump;
open (FILE, 'input.txt');
chomp (my @lines = (<FILE>));
close(FILE);
my %hash;
$hash{$_} = [ glob("$_*.bam") ] for @lines;
dd %hash;
这将打印我的数组散列:
(
"HG00117",
[
"HG00117.mapped.ILLUMINA.bwa.GBR.exome.20120522.bam_herc2_data.bam",
"HG00117.mapped.ILLUMINA.bwa.GBR.low_coverage.20101123.bam_herc2_phase1.bam",
"HG00117.mapped.ILLUMINA.bwa.GBR.low_coverage.20120522.bam_herc2_data.bam",
"HG00117.mapped.illumina.mosaik.GBR.exome.20110411.bam_herc2_phase1.bam",
],
"HG00119",
[
"HG00119.mapped.ILLUMINA.bwa.GBR.exome.20120522.bam_herc2_data.bam",
"HG00119.mapped.ILLUMINA.bwa.GBR.low_coverage.20101123.bam_herc2_phase1.bam",
"HG00119.mapped.ILLUMINA.bwa.GBR.low_coverage.20120522.bam_herc2_data.bam",
"HG00119.mapped.illumina.mosaik.GBR.exome.20110411.bam_herc2_phase1.bam",
],
"NA20828",
[
"NA20828.mapped.ILLUMINA.bwa.TSI.exome.20121211.bam_herc2_data.bam",
"NA20828.mapped.ILLUMINA.bwa.TSI.low_coverage.20101123.bam_herc2_phase1.bam",
"NA20828.mapped.ILLUMINA.bwa.TSI.low_coverage.20130415.bam_herc2_data.bam",
"NA20828.mapped.illumina.mosaik.TSI.exome.20110411.bam_herc2_phase1.bam",
],
)
我想给数组的每个元素加上前缀INPUT=
,所以它们看起来像这样
(
"HG00117",
[
"INPUT=HG00117.mapped.ILLUMINA.bwa.GBR.exome.20120522.bam_herc2_data.bam",
"INPUT=HG00117.mapped.ILLUMINA.bwa.GBR.low_coverage.20101123.bam_herc2_phase1.bam",
"INPUT=HG00117.mapped.ILLUMINA.bwa.GBR.low_coverage.20120522.bam_herc2_data.bam",
"INPUT=HG00117.mapped.illumina.mosaik.GBR.exome.20110411.bam_herc2_phase1.bam",
],
"HG00119",
[
"INPUT=HG00119.mapped.ILLUMINA.bwa.GBR.exome.20120522.bam_herc2_data.bam",
"INPUT=HG00119.mapped.ILLUMINA.bwa.GBR.low_coverage.20101123.bam_herc2_phase1.bam",
"INPUT=HG00119.mapped.ILLUMINA.bwa.GBR.low_coverage.20120522.bam_herc2_data.bam",
"INPUT=HG00119.mapped.illumina.mosaik.GBR.exome.20110411.bam_herc2_phase1.bam",
],
"NA20828",
[
"INPUT=NA20828.mapped.ILLUMINA.bwa.TSI.exome.20121211.bam_herc2_data.bam",
"INPUT=NA20828.mapped.ILLUMINA.bwa.TSI.low_coverage.20101123.bam_herc2_phase1.bam",
"INPUT=NA20828.mapped.ILLUMINA.bwa.TSI.low_coverage.20130415.bam_herc2_data.bam",
"INPUT=NA20828.mapped.illumina.mosaik.TSI.exome.20110411.bam_herc2_phase1.bam",
],
)
我尝试了正则表达式和 grep
但似乎没有任何效果。我想我对 foreach
的范围感到困惑。我也尝试了 rename
功能,但它没有用。
因此,迭代每个元素 - 您实际上需要两个循环。一个用于 'top level' - 哈希值。 (这是数组引用)。
然后对于每个数组引用,在应用转换的对象中进行迭代。
foreach my $array_ref ( values %hash ) {
foreach my $oldfilename ( @$array_ref ) {
$element =~ s/^/INPUT=/;
}
}
或者您真的想更改磁盘上的文件名?如果是这样,您可以使用 rename
(不过我认为这不是您想要的)
foreach my $array_ref ( values %hash ) {
foreach my $oldfilename ( @$array_ref ) {
rename $oldfilename, 'INPUT='.$oldfilename
}
}
这可以巧妙地完成,方法是根据 input.txt
的内容构建一个正则表达式,并对照它检查所有 *.bam
个文件。
像这样
use strict;
use warnings;
my @patterns = do {
open my $in_fh, '<', 'input.txt' or die qq{Unable to open "input.txt" for input: $!};
<$in_fh>;
};
chomp @patterns;
my $re = join '|', map quotemeta, @patterns;
my @files = grep /^(?:$re)/, glob '*.bam';
$_ = "INPUT=$_" for @files;