Perl: Удаление дубликатов из большого набора данных

I ' m с помощью Perl для создания списка уникальных экзонов (которые являются единицами генов).

Я создал файл в этом формате (с сотнями тысяч строк):

chr1 1000 2000 gene1

chr1 3000 4000 gene2

chr1 5000 6000 gene3

chr1 1000 2000 gene4

Позиция 1 - хромосома, позиция 2 - начальная координата экзона, позиция 3 - конечная координата экзона, а позиция 4 это имя гена.

Поскольку гены часто состоят из разного расположения экзонов, у вас есть один и тот же экзон в нескольких генах (см. Первый и четвертый наборы). Я хочу удалить эти «дубликаты», то есть удалить ген1 или ген4 (не важно, какой из них будет удален).

Я часами бился головой о стену, пытаясь сделать то, что (как мне кажется) является простой задачей . Может ли кто-нибудь указать мне в правильном направлении? Я знаю, что люди часто используют хеши для удаления повторяющихся элементов, но это не совсем дубликаты (поскольку имена генов разные). Также важно не потерять имя гена. В противном случае это было бы проще.

Вот полностью нефункциональный цикл, который я пробовал. В массиве «экзонов» каждая строка хранится как скаляр, отсюда и подпрограмма. Не смейся. Я знаю, что это не работает, но, по крайней мере, вы видите (я надеюсь), что я пытаюсь сделать:

for (my $i = 0; $i < scalar @exons; $i++) {
my @temp_line = line_splitter($exons[$i]);                      # runs subroutine turning scalar into array
for (my $j = 0; $j < scalar @exons_dup; $j++) {
    my @inner_temp_line = line_splitter($exons_dup[$j]);        # runs subroutine turning scalar into array
    unless (($temp_line[1] == $inner_temp_line[1]) &&           # this loop ensures that the the loop
            ($temp_line[3] eq $inner_temp_line[3])) {           # below skips the identical lines
                if (($temp_line[1] == $inner_temp_line[1]) &&   # if the coordinates are the same
                    ($temp_line[2] == $inner_temp_line[2])) {   # between the comparisons
                        splice(@exons, $i, 1);                  # delete the first one
                    }
            }
}

}

6
задан David M 18 April 2011 в 21:01
поделиться