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

Я пытаюсь написать скрипт, который преобразует каждый аллель (A, T, G или C) в моем файле в 0 или 1 в зависимости от его исходного состояния в этой позиции, которая сохраняется в другом файле «DAF.txt». есть два файла. Они упорядочены в зависимости от положения в геноме, но содержат разную информацию.

Файл 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», чтобы файл.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 в строке 17 test.pl, ‹$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
Это прекрасно работает! Благодарю вас! Как мне записать преобразованный вывод в новый файл, новый файл .hap? - person user3482899; 14.05.2014
comment
@ user3482899: Вы можете просто перенаправить вывод оригинала: perl script.pl > file.hap. - person choroba; 14.05.2014