Re: Cruzar dos listas
Publicado: 2011-02-21 16:28 @728
Bueno, esta es mi solución, en Perl moderno.
Using perl Syntax Highlighting
- #!/usr/bin/perl
- use common::sense;
- use Data::Dumper::Simple;
- ### Leemos el primer fichero
- my %cromosomas;
- open my $fh, '<', 'lista.txt' or die $!;
- while (<$fh>) {
- chomp;
- my ($cromosoma, $posición, $gen) = split;
- push @{ $cromosomas{ $cromosoma } }, [ $posición, $gen ]; # creamos una estructura de un hash de arrays de arrays
- # por cada $cromosoma, creamos un array donde guardamos,
- # en cada elemento, otro array, con dos elementos:
- # la $posición y el símbolo del $gen
- }
- close $fh;
- ### Reordenación numérica de las posiciones de los genes
- while (my($cromosoma, $array_ref) = each %cromosomas) {
- @{ $cromosomas{ $cromosoma } } = sort { $a->[0] <=> $b->[0] } @$array_ref;
- }
- say Dumper %cromosomas; # Así queda la estructura 3D
- # Ahora hay que ponerse las gafas ☺
- ### Procesamiento de la base de datos
- open my $fh2, '<', 'TrozoDB.txt' or die $!;
- while (<$fh2>) {
- chomp;
- my ($ID, $inicio, $final, $cromosoma) = split;
- if ( $cromosomas{ $cromosoma } ) { # si el cromosoma lo tenemos
- for my $array_ref (@{ $cromosomas{ $cromosoma } }) { # sacamos todas sus posiciones y genes
- my($posición, $gen) = @$array_ref; # sacamos la posición y el gen
- next if $posición < $inicio; # aún no estamos dentro del rango
- last if $posición > $final; # salimos rápido si ya estamos fuera del rango
- say "$gen\t$ID"; # hemos encontrado un $gen dentro del rango
- last; # no necesitamos mirar más posiciones
- }
- }
- }
- close $fh2;
- __END__
- %cromosomas = (
- 'Chr2' => [
- [
- 1138898,
- 'ACR5'
- ],
- [
- 8476733,
- 'ACO1'
- ]
- ],
- 'Chr4' => [
- [
- 13221122,
- 'ABI1'
- ],
- [
- 13546819,
- 'ACO2'
- ]
- ],
- 'Chr1' => [
- [
- 4511450,
- 'ACA.l'
- ],
- [
- 11411539,
- 'ACBP6'
- ],
- [
- 19160151,
- '4CL1'
- ],
- [
- 23083211,
- 'ACO2'
- ]
- ],
- 'Chr3' => [
- [
- '21213915',
- 'ACA11'
- ]
- ],
- 'Chr5' => [
- [
- 6590160,
- 'ACL5'
- ],
- [
- 25894043,
- 'ABR1'
- ]
- ]
- );
- ACO2 AT1G62380
- ACO2 AT4G26970
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4