私は2つのファイルを持っています:
- file_1には、3つの列(Marker(SNP)、Chromosome、およびposition)があります。
- file_2には、3つの列(Chromosome、peak_start、およびpeak_end)があります。
SNP列を除くすべての列は数値です。
ファイルはスクリーンショットに示されているように配置されています。file_1には行として数百のSNPがあり、file_2には61のピークがあります。各ピークは、peak_startとpeak_endでマークされます。どちらのファイルにも23の染色体のいずれかが存在する可能性があり、file_2には染色体ごとにいくつかのピークがあります。
file_1のSNPの位置が、一致する各染色体のfile_2のpeak_startとpeak_endの範囲内にあるかどうかを調べたいと思います。もしそうなら、どのSNPがどのピークにあるかを示したい(できればタブ区切りファイルに出力を書き込む)。
ファイルを分割し、染色体がキーとなるハッシュを使用したいと思います。これに似た質問をいくつか見つけましたが、提案された解決策をよく理解できませんでした。
これが私のコードの例です。これは私の質問を説明するためだけのものであり、これまでのところ何もしていないので、「擬似コード」と考えてください。
#!usr/bin/perl
use strict;
use warnings;
my (%peaks, %X81_05);
my @array;
# Open file or die
unless (open (FIRST_SAMPLE, "X81_05.txt")) {
die "Could not open X81_05.txt";
}
# Split the tab-delimited file into respective fields
while (<FIRST_SAMPLE>) {
chomp $_;
next if (m/Chromosome/); # Skip the header
@array = split("\t", $_);
($chr1, $pos, $sample) = @array;
$X81_05{'$array[0]'} = (
'position' =>'$array[1]'
)
}
close (FIRST_SAMPLE);
# Open file using file handle
unless (open (PEAKS, "peaks.txt")) {
die "could not open peaks.txt";
}
my ($chr, $peak_start, $peak_end);
while (<PEAKS>) {
chomp $_;
next if (m/Chromosome/); # Skip header
($chr, $peak_start, $peak_end) = split(/\t/);
$peaks{$chr}{'peak_start'} = $peak_start;
$peaks{$chr}{'peak_end'} = $peak_end;
}
close (PEAKS);
for my $chr1 (keys %X81_05) {
my $val = $X81_05{$chr1}{'position'};
for my $chr (keys %peaks) {
my $min = $peaks{$chr}{'peak_start'};
my $max = $peaks{$chr}{'peak_end'};
if (($val > $min) and ($val < $max)) {
#print $val, " ", "lies between"," ", $min, " ", "and", " ", $max, "\n";
}
else {
#print $val, " ", "does not lie between"," ", $min, " ", "and", " ", $max, "\n";
}
}
}
より素晴らしいコード: