У меня есть два файла:Использование Perl хэши для обработки разделителями табуляции файлов
- file_1 имеет три колонки (Marker (SNP), Хромосома, и позиция)
- file_2 имеет три колонки (хромосома, peak_start, и peak_end).
Все столбцы являются числовыми, за исключением столбца SNP.
Файлы упорядочены, как показано на скриншотах. file_1 имеет несколько сотен SNP в виде строк, а файл_2 имеет 61 пик. Каждый пик отмечен значком peak_start и peak_end. В любом файле может быть любая из 23 хромосом, а файл_2 имеет несколько пиков на хромосому.
Я хочу найти, если позиция SNP в файле_1 попадает в пик_старт и пик_ен в файле_2 для каждой соответствующей хромосомы. Если это так, я хочу показать, какой 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";
}
}
}
Более удивительный код:
Похоже, задача для [Текст :: CSV] (http://search.cpan.org/perldoc?Text::CSV) .. изобретать колесо не удивительным;) –
Сколько строк (строк) в каждом файле? Может ли хромосома появляться более одного раза в файле 2, то есть каждая хромосома имеет собственный диапазон пиков? Если это так, вы можете прочитать в файле 2 и запустить файл 1 против него ... –
Это теги, разделенные таблицами, а не разделители табуляции, вы знаете. – tchrist