Управление файлами в соответствии с индексами по Perl - PullRequest
0 голосов
/ 22 февраля 2012

Я работаю над некоторыми данными генома, и у меня есть 2 файла ->

Файл1

A1 1   10
A1  15  20
A2  2   11
A2  13  16

Файл2

>A1
CTATTATTTATCGCACCTACGTTCAATATTACAGGCGAACATACCTACTA
AAGTGTGTTAATTAATTAATGCTTGTAGGACATAATAATAACAATTGAAT
>A2
GTCTGCACAGCCGCTTTCCACACAGACATCATAACAAAAAATTTCCACCA
AACCCCCCCCTCCCCCCGCTTCTGGCCACAGCACTTAAACACATCTCTGC
CAAACCCCAAAAACAAAGAACCCTAACACCAGCCTAACCAGATTTCAAAT

В файле 1, 2 и 3столбец представляет индексы в File2.Поэтому я хочу, чтобы, если символ в столбце1 файла1 совпадал с символом, за которым следует символ (>) в файле2, то из следующей строки этого файла2 возвращать подстроку в соответствии с индексами в столбцах col2 и col3 файла1.(извините, я знаю, это сложно) Вот вывод желаний ->

Вывод

>A1#1:10
CTATTATTTA
>A1#15:20
ACCTA
>A2#2:11
TCTGCACAGC
>A2#13:16
GCTT

Я знаю, что если у меня есть только 1 строка, я могу очень легко извлечь подстроку ->

@ARGV or die "No input file specified";
open $first, '<',$ARGV[0] or die "Unable to open input file: $!";
$string="GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCAT";
while (<$first>) 
{
@cols = split /\s+/;
$co=$cols[1]-1;
$length=$cols[2]-$co;
$fragment =  substr $string, $co, $length;
print ">",$cols[0],"#",$cols[1],":",$cols[2],"\n",$fragment,"\n";
}

но здесь моя проблема в том, когда я должен ввести свой второй файл и как мне сопоставить символ в столбце col1 (файла1) с символом в файле2 (за которым следует> символ), а затем получить подстроку

Ответы [ 3 ]

1 голос
/ 22 февраля 2012

Я не был уверен, были ли они одной сплошной линией или отдельными линиями. Я установил это как непрерывное пока.

В основном, прочитайте 2-й файл как master. Затем вы можете обработать столько файлов индекса, сколько вам нужно.

Вы можете использовать хэш массивов, чтобы помочь с индексацией. push @ {$ index {$ key}}, [$ start, $ stop];

use strict;
my $master_file = "dna_master.txt";
if ($#ARGV) {
    print "Usage: $0 [filename(s)]\n";
    exit 1;
}

my %Data = read_master($master_file);

foreach my $index_file (@ARGV) {
    my %Index = read_index($index_file);
    foreach my $key (sort keys %Index) {
        foreach my $i (@{$Index{$key}}) {
            my ($start,$stop) = @$i;
            print ">$key#$start:$stop\n";
            my $pos = $start - 1;
            my $count = $stop - $start + 1;
            print substr($Data{$key},$pos,$count)."\n";
        }
    }
}

sub read_file {
    my $file = shift;
    my @lines;
    open(FILE, $file) or die "Error: cannot open $file\n$!";
    while(<FILE>){
        chomp; #remove newline
        s/(^\s+|\s+$)//g; # strip lead/trail whitespace
        next if /^$/;  # skip blanks
        push @lines, $_;
    }
    close FILE;
    return @lines;
}

sub read_index {
    my $file = shift;
    my @lines = read_file($file);
    my %index;
    foreach (@lines) {
        my ($key,$start,$stop) = split /\s+/;
        push @{$index{$key}}, [$start,$stop]; 
    }
    return %index;
}

sub read_master {
    my $file = shift;
    my %master;
    my $key;
    my @lines = read_file($file);
    foreach (@lines) {
        if ( m{^>(\w+)} ) { $key = $1 }
        else { $master{$key} .= $_ }
    }
    return %master;
}
1 голос
/ 22 февраля 2012

Это второе обновление также превращает основной файл в хэш массивов.

При этом каждая строка второго файла обрабатывается как отдельные последовательности.

use strict;
my $master_file = "dna_master.txt";
if ($#ARGV) {
    print "Usage: $0 [filename(s)]\n";
    exit 1;
}

my %Data = read_master($master_file);

foreach my $index_file (@ARGV) {
    my %Index = read_index($index_file);
    foreach my $key (sort keys %Index) {
        foreach my $i (@{$Index{$key}}) {
            my ($start,$stop) = @$i;
            print ">$key#$start:$stop\n";
            my $pos = $start - 1;
            my $count = $stop - $start + 1;
            foreach my $seq (@{$Data{$key}}) {
                print substr($seq,$pos,$count)."\n";
            }
        }
    }
}

sub read_file {
    my $file = shift;
    my @lines;
    open(FILE, $file) or die "Error: cannot open $file\n$!";
    while(<FILE>){
        chomp; #remove newline
        s/(^\s+|\s+$)//g; # strip lead/trail whitespace
        next if /^$/;  # skip blanks
        push @lines, $_;
    }
    close FILE;
    return @lines;
}

sub read_index {
    my $file = shift;
    my @lines = read_file($file);
    my %index;
    foreach (@lines) {
        my ($key,$start,$stop) = split /\s+/;
        push @{$index{$key}}, [$start,$stop]; 
    }
    return %index;
}

sub read_master {
    my $file = shift;
    my %master;
    my $key;
    my @lines = read_file($file);
    foreach (@lines) {
        if ( m{^>(\w+)} ) { $key = $1 }
        else { push @{ $master{$key} }, $_ }
    }
    return %master;
}

Выход:

>A1#1:10
CTATTATTTA
AAGTGTGTTA
>A1#15:20
ACCTAC
ATTAAT
>A2#2:11
TCTGCACAGC
ACCCCCCCCT
AAACCCCAAA
>A2#13:16
GCTT
CCCC
ACAA
1 голос
/ 22 февраля 2012

Загрузка файла 2 в хэш, с ключами A1, A2 ... и последовательностью ДНК в качестве значения. Таким образом, вы можете легко получить последовательность ДНК.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...