• Publicidad

Comparar líneas entre archivos

Perl aplicado a la bioinformática

Comparar líneas entre archivos

Notapor mguajardo88 » 2011-01-11 11:00 @500

Tengo un gran problema; recién estoy aprendiendo Perl y necesito ayuda con esto:

Lo que quiero es leer la primera línea de mi primer archivo y que compare el primer string con
el primer string de cada línea de mi segundo archivo y si son distintos lo guarde en un nuevo archivo
de salida y así continúe con cada línea hasta recorrer todo mi primer archivo.

Los archivos son más o menos así, aunque un poco más largos XD.

Primer archivo de está forma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
FBgn0002121_intergenic_FBgn0031209    1
FBgn0026787_intergenic_FBgn0005278    1
FBgn0005278_intergenic_FBgn0031219    1
FBgn0259818_intergenic_FBgn0031227    1
FBgn0086902_intergenic_FBgn0022246    1
FBgn0022246_intergenic_FBgn0031238    1
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Segundo archivo de esta forma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
_intergenic_FBgn0069969    50472    50480
_intergenic_FBgn0069969    50743    50751
_intergenic_FBgn0069969    50828    50836
_intergenic_FBgn0069969    51845    51853
_intergenic_FBgn0069969    52161    52169
_intergenic_FBgn0069969    52741    52749
_intergenic_FBgn0069969    52777    52785
FBgn0069969_intergenic_FBgn0085793    266    274
FBgn0069969_intergenic_FBgn0085793    366    374
FBgn0069969_intergenic_FBgn0085793    719    727
FBgn0069969_intergenic_FBgn0085793    853    861
FBgn0069969_intergenic_FBgn0085793    1044    1052
FBgn0069969_intergenic_FBgn0085793    1163    1171
FBgn0085793_intergenic_FBgn0085582    70    78
FBgn0085793_intergenic_FBgn0085582    445    453
FBgn0085793_intergenic_FBgn0085582    505    513
FBgn0085793_intergenic_FBgn0085582    1770    1778
FBgn0085793_intergenic_FBgn0085582    1775    1783
FBgn0085793_intergenic_FBgn0085582    1803    1811
FBgn0085793_intergenic_FBgn0085582    1865    1873
FBgn0085793_intergenic_FBgn0085582    2180    2188
FBgn0085793_intergenic_FBgn0085582    3549    3557
FBgn0085793_intergenic_FBgn0085582    4018    4026
FBgn0085793_intergenic_FBgn0085582    4152    4160
_intergenic_FBgn0031208 5815    5823
_intergenic_FBgn0031208 6434    6442
_intergenic_FBgn0031208 6826    6834
_intergenic_FBgn0031208 6866    6874
FBgn0002121_intergenic_FBgn0031209      1       9
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
mguajardo88
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2011-01-11 10:45 @489

Publicidad

Re: Comparar líneas entre archivos

Notapor explorer » 2011-01-11 11:29 @520

Bienvenido a los foros de Perl en Español, mguajardo88.

Se trata de un problema muy común y que en estos foros se ha tratado en más de una ocasión. Usa el sistema de búsqueda para encontrar más referencias.

Aquí tienes una posible solución. La salida, según los ficheros de ejemplo indicados, está al final.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use common::sense;                      # sentido común
  3. use autodie;                            # y sacrificio
  4. use File::Slurp;                        # sin dejar de chupar
  5.  
  6. ## Leer ficheros
  7. my @primer_archivo  = read_file('fichero_primero.txt');
  8. my @segundo_archivo = read_file('fichero_segundo.txt');
  9.  
  10. ## Transformación del segundo archivo
  11. for my $linea (@segundo_archivo) {
  12.        $linea = (split " ", $linea)[0]; # Nos quedamos solo con
  13.                                         # la primera cadena de cada línea
  14. }
  15.  
  16. ## Apertura del fichero de diferencias
  17. open my $fichero_diferencias, '>', 'fichero_diferencias.txt';
  18.  
  19. ## Comparación
  20. for my $linea (@primer_archivo) {
  21.     my $primera_cadena = (split " ", $linea)[0];
  22.    
  23.     unless ($primera_cadena ~~ @segundo_archivo) {   # a menos que la $primera_cadena esté en el @segundo_archivo,
  24.         print $fichero_diferencias $linea;           # lo escribimos en el $fichero_diferencias
  25.     }
  26. }
  27.  
  28. ## Cierre del fichero de diferencias
  29. close $fichero_diferencias;
  30.  
  31. __END__
  32. FBgn0026787_intergenic_FBgn0005278    1
  33. FBgn0005278_intergenic_FBgn0031219    1
  34. FBgn0259818_intergenic_FBgn0031227    1
  35. FBgn0086902_intergenic_FBgn0022246    1
  36. FBgn0022246_intergenic_FBgn0031238    1
  37.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Comparar líneas entre archivos

Notapor mguajardo88 » 2011-01-13 10:28 @478

¡HEY! Te pasaste. Me sirvió millones...
Seguiré con el resto :D
mguajardo88
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2011-01-11 10:45 @489

Re: Comparar líneas entre archivos

Notapor mguajardo88 » 2011-11-04 10:34 @482

Hola nuevamente. Retomando este tema me nació una duda, no sé si alguien me puede ayudar

Si quisiera hacer la misma comparación, pero esta vez buscar las similitudes, cambio el unless() por un if(), ¿cierto? ¿Y si quiero imprimir en el archivo de salida ambas líneas, es decir, la del archivo 1 y del archivo 2 que son coincidentes?

¡Saludos!
mguajardo88
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2011-01-11 10:45 @489

Re: Comparar líneas entre archivos

Notapor explorer » 2011-11-04 10:43 @488

Primera pregunta: cierto.

Segunda pregunta: supongo que se resolvería abriendo en modo escritura un segundo fichero, donde guardar las que son coincidentes. O cambiar de nombre el fichero que aparece en la línea 17. Le pones 'fichero_equivalentes.txt', por ejemplo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Comparar líneas entre archivos

Notapor mguajardo88 » 2011-11-04 11:03 @502

¡Gracias! Mi pregunta va a cómo le paso ambas líneas para copiarlas en el fichero de salida.

Acá -> print $fichero_diferencias $linea;

¿Cómo identifica las líneas de ambos ficheros?
mguajardo88
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2011-01-11 10:45 @489

Re: Comparar líneas entre archivos

Notapor explorer » 2011-11-04 11:11 @508

El formato del fichero de salida lo tienes que definir tu.

¿Quieres que salga las dos líneas una continuación de la otra? Pues haces dos print(), uno por cada línea, hacia el fichero de salida.

¿Que quieres otro formato? Pues entonces tendrás que diseñar un print() que cumpla con ese formato.

Por otra parte, ¿para qué quieres sacar dos líneas que son idénticas, en el mismo fichero?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Comparar líneas entre archivos

Notapor mguajardo88 » 2011-11-04 11:15 @510

¡Es que las líneas no son idénticas! Tienen el primer campo igual y el resto es diferente como los archivos de ejemplo que están arriba. Por eso mi consulta iba a que si ambas reciben el nombre $linea cómo identifico para copiar ambas. No sé si soy clara :D Sinceramente, hasta yo me confundo.
mguajardo88
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2011-01-11 10:45 @489

Re: Comparar líneas entre archivos

Notapor explorer » 2011-11-04 11:43 @530

La línea original se pierde, quedándose solo en el primer campo (línea 12).

Quizás si pones qué fichero de salida debe salir, dados los dos primeros ficheros del primer mensaje de este hilo, nos aclararemos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Comparar líneas entre archivos

Notapor mguajardo88 » 2011-11-04 11:52 @536

¡Justamente! Bueno, lo que yo consulto es algo como esto:

archivo1:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
FBgn0002121_intergenic_FBgn0031209    1
FBgn0026787_intergenic_FBgn0005278    1
FBgn0005278_intergenic_FBgn0031219    1
FBgn0259818_intergenic_FBgn0031227    1
FBgn0086902_intergenic_FBgn0022246    1
FBgn0022246_intergenic_FBgn0031238    1
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


archivo2:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
_intergenic_FBgn0069969    50472    50480
_intergenic_FBgn0069969    50743    50751
_intergenic_FBgn0069969    50828    50836
_intergenic_FBgn0069969    51845    51853
_intergenic_FBgn0069969    52161    52169
_intergenic_FBgn0069969    52741    52749
_intergenic_FBgn0069969    52777    52785
FBgn0026787_intergenic_FBgn0005278    1      9 
FBgn0069969_intergenic_FBgn0085793    266    274
FBgn0069969_intergenic_FBgn0085793    366    374
FBgn0069969_intergenic_FBgn0085793    719    727
FBgn0069969_intergenic_FBgn0085793    853    861
FBgn0069969_intergenic_FBgn0085793    1044    1052
FBgn0069969_intergenic_FBgn0085793    1163    1171
FBgn0085793_intergenic_FBgn0085582    70    78
FBgn0085793_intergenic_FBgn0085582    445    453
FBgn0085793_intergenic_FBgn0085582    505    513
FBgn0085793_intergenic_FBgn0085582    1770    1778
FBgn0085793_intergenic_FBgn0085582    1775    1783
FBgn0085793_intergenic_FBgn0085582    1803    1811
FBgn0085793_intergenic_FBgn0085582    1865    1873
FBgn0085793_intergenic_FBgn0085582    2180    2188
FBgn0085793_intergenic_FBgn0085582    3549    3557
FBgn0085793_intergenic_FBgn0085582    4018    4026
FBgn0085793_intergenic_FBgn0085582    4152    4160
_intergenic_FBgn0031208 5815    5823
_intergenic_FBgn0031208 6434    6442
_intergenic_FBgn0031208 6826    6834
_intergenic_FBgn0031208 6866    6874
FBgn0002121_intergenic_FBgn0031209      1       9
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Archivo de salida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
FBgn0002121_intergenic_FBgn0031209    1
FBgn0002121_intergenic_FBgn0031209    1       9
FBgn0026787_intergenic_FBgn0005278    1
FBgn0026787_intergenic_FBgn0005278    1      9
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Espero ahora ser un poco más clara.
mguajardo88
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2011-01-11 10:45 @489

Siguiente

Volver a Bioinformática

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado