Как да търсите и присвоявате стойности между два файла към нов файл с помощта на Perl

Опитвам се да напиша скрипт, който преобразува всеки алел (A, T, G или C) в моя файл в 0 или 1 в зависимост от неговото състояние на предците в тази позиция, което е записано в друг файл "DAF.txt" I има два файла. Те са подредени въз основа на геномна позиция, но съдържат различна информация.

Файл 1: Алели

    1 2 3 4 ...900000
    A G T C G
    G A G G C
    A A T C C

DAF.txt: Наследствен статус

    1 A
    2 A
    3 T
    4 G
    ...900000 C

DAF.txt служи като препратка към сортиране на файл 1. Всеки ред от файл 1 трябва да се сравнява колона по колона с всеки ред в DAF.txt Ако буквата в колона 1, ред 1 във файл 1 == буквата в ред 1 в DAF.txt, тогава трябва да заменя тази буква или да отпечатам "0" в нов файл на нейно място, file.hap, в противен случай, ако буквите във файловете не съвпадат на тази позиция, тогава да отпечатам "1" в file.hap. Редът има значение. file.hap трябва да бъде в същия ред като файл 1.

В крайна сметка file.hap трябва да изглежда така:

    1 2 3 4 ...900000
    0 1 0 1 1
    1 0 1 0 0
    0 0 0 1 0

Някакви предложения за правене на това в perl? Това е голям файл...


person user3482899    schedule 18.04.2014    source източник


Отговори (1)


Ако имате достатъчно памет, можете да съхраните наследствените алели в масив:

#!/usr/bin/perl
use warnings;
use strict;

open my $DAF, '<', 'DAF.txt' or die $!;
open my $AL,  '<', 'alleles' or die $!;

my @ancestral;
while (<$DAF>) {
    chomp;
    push @ancestral, $_;
}

<$AL>;                        # Skip the header.
while (my $al_line = <$AL>) {
    my @alleles = split ' ', $al_line;
    for my $i (0 .. $#alleles) {
        print $alleles[$i] eq $ancestral[$i] ? 0 : 1;
        print ' ' unless $i == $#alleles;
    }
    print "\n";
}
person choroba    schedule 18.04.2014
comment
Ако не го направите, разделете файла на N файла и просто отворете, проверете, затворете, следващ. Това е едно лесно решение на проблем с паметта. - person Eugene K; 18.04.2014
comment
Когато опитам това, получавам следната грешка: Използване на неинициализирана стойност в низ eq в test.pl ред 17, ‹$AL› ред 1 за всеки ред във файла. За да поясним, нито един файл няма заглавка; Просто поставих заглавката във въпроса, за да следя какво представлява всяка колона. Така че защо е грешката? Освен това трябва да запиша конвертирания изход в нов файл, file.hap, но не съм сигурен къде да го поставя. - person user3482899; 14.05.2014
comment
Опитах се да добавя заглавка към всеки файл и все още получавам същата грешка. Не разбирам какво правя погрешно =( - person user3482899; 14.05.2014
comment
@user3482899: Файлът DAF съдържа ли номера на редове, както е показано във вашия пример? - person choroba; 14.05.2014
comment
ах Не не е. Той буквално съдържа само един алел на ред. Как това променя нещата? - person user3482899; 14.05.2014
comment
@user3482899: Опитайте актуализирания код. Ако редът съдържа само една стойност, няма нужда да я split. - person choroba; 14.05.2014
comment
Това работи прекрасно! Благодаря ти! Как да запиша конвертирания изход в нов файл, new file.hap? - person user3482899; 14.05.2014
comment
@user3482899: Можете просто да пренасочите изхода на оригинала: perl script.pl > file.hap. - person choroba; 14.05.2014