Итак, мой образец данных в следующем формате.
jgi|Xentr4|100164|gw1.1441.2.1 scaffold_1441 18150 18354
jgi|Xentr4|100164|gw1.1441.2.1 scaffold_1441 19856 19974
jgi|Xentr4|100164|gw1.1441.2.1 scaffold_1441 21455 21638
jgi|Xentr4|100164|gw1.1441.2.1 scaffold_1441 21727 21897
jgi|Xentr4|100164|gw1.1441.2.1 scaffold_1441 21980 22063
jgi|Xentr4|100164|gw1.1441.2.1 scaffold_1441 24670 24811
jgi|Xentr4|100164|gw1.1441.2.1 scaffold_1441 34741 34902
jgi|Xentr4|100164|gw1.1441.2.1 scaffold_1441 3649 3836
jgi|Xentr4|100164|gw1.1441.2.1 scaffold_1441 59253 59409
jgi|Xentr4|100173|gw1.779.90.1 scaffold_779 101746 101969
jgi|Xentr4|100173|gw1.779.90.1 scaffold_779 106436 107233
и я пытаюсь сделать это для каждого уникального имени в первом столбце, получить минимальное значение для столбца 3 и максимальное значение для столбца 4. Таким образом, окончательный ввод будет выглядеть одинаково, файл с разделителями табуляции за исключением того, что у него будут первые 2 столбца для каждого уникального имени, тогда 3-й и 4-й столбцы будут минимальными и максимальными значениями, упомянутыми выше. Я довольно новичок в программировании и пытался сделать это с помощью хэшей, но с треском провалился. Я пытаюсь сейчас с массивами / регулярными выражениями, как показано ниже.
open (IN, "POS2") || die "nope\n";
my $prev_qn = super;
my $prev_sn = ultra;
my $prev_start = non;
my $prev_end = nono;
while (<IN>) {
chomp;
push (@list, "$_");
}
close (IN);
foreach $v (@list) {
$info = $v;
($query_name, $scaf_num, $start, $end) = split(/\t/, $info);
unless ($info =~ m/^$prev_qn/) {
push @ready, $info;
$prev_qn = $query_name;
$prev_sn = $scaf_num;
$prev_start = $start;
$prev_end = $end;
}
else {
if ($start < $prev_start) {
splice(@ready,2,1,$start);
}
if ($end > $prev_end) {
splice(@ready,3,1,$end);
}
$prev_qn = $query_name;
$prev_sn = $scaf_num;
$prev_start = $start;
$prev_end = $end;
}
foreach $z (@ready) {
print "$z\n";
}
}
результат, который это возвращает, ниже.
jgi|Xentr4|100164|gw1.1441.2.1 scaffold_1441 18150 18354
jgi|Xentr4|100164|gw1.1441.2.1 scaffold_1441 18150 18354
19974
jgi|Xentr4|100164|gw1.1441.2.1 scaffold_1441 18150 18354
19974
21638
jgi|Xentr4|100164|gw1.1441.2.1 scaffold_1441 18150 18354
19974
21638
21897
jgi|Xentr4|100164|gw1.1441.2.1 scaffold_1441 18150 18354
19974
21638
22063
jgi|Xentr4|100164|gw1.1441.2.1 scaffold_1441 18150 18354
19974
21638
24811
jgi|Xentr4|100164|gw1.1441.2.1 scaffold_1441 18150 18354
19974
21638
34902
jgi|Xentr4|100164|gw1.1441.2.1 scaffold_1441 18150 18354
19974
3649
34902
jgi|Xentr4|100164|gw1.1441.2.1 scaffold_1441 18150 18354
19974
3649
59409
jgi|Xentr4|100164|gw1.1441.2.1 scaffold_1441 18150 18354
19974
3649
101969
Таким образом, очевидно, что файл выполняет сравнение нормально, но он не заменяет элементы в массиве, как ожидалось, просто добавляет их под ними и заменяет их. Кроме того, он никогда не печатает мимо первого уникального имени. Есть предложения?