• Publicidad

Problema con bucles y comparaciones

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Problema con bucles y comparaciones

Notapor el_dandy » 2018-03-20 18:46 @824

Hola.

Estoy tratando de hacer comparaciones entre dos archivos de texto, ambos separados por "\t".

El archivo "pba1.txt" tiene la siguiente estructura:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
a       b
a       c
a       d
b       c
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


El archivo "pba2.txt" tiene la siguiente estructura:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
b       b
c       d
a       a
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Lo que deseo hacer es comparar la segunda columna de cada archivo, y si hay coincidencia que me imprima el par más la "OK" y si no hay coincidencia que me imprima el par más "otro".

El resultado esperado sería algo como esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
a       b       OK
a       d       OK
a       c       otro
b       c       otro
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


He escrito el siguiente código y el resultado es distinto al esperado. Espero que alguien me pueda comentar qué es lo que estoy haciendo mal.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #! /usr/bin/perl
  2.  
  3. my $file = $ARGV[0];
  4. my $sfile = $ARGV[1];
  5.  
  6. open FILE, $file;
  7. open SFILE, $sfile;
  8.  
  9. my @array = <FILE>;
  10. my @sarray = <SFILE>;
  11.  
  12. chomp @array;
  13. chomp @sarray;
  14.  
  15. close FILE;
  16. close SFILE;
  17.  
  18.  
  19. for $i (@array) {
  20.  
  21.         my @cols = split(/\t/, $i);
  22.  
  23.         for $j (@sarray){
  24.  
  25.                 my @scols= split(/\t/, $j);
  26.  
  27.                 if($cols[1] eq $scols[1]){
  28.  
  29.                         print "$cols[0]\t$cols[1]\tOK\n";
  30.  
  31.                 }
  32.  
  33.                 else{
  34.  
  35.  
  36.                                 print "$cols[0]\t$cols[1]\totro\n";
  37.                
  38.                 }
  39.         }
  40. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

El resultado que obtengo con este código es este:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
a       b       OK
a       b       otro
a       b       otro
a       c       otro
a       c       otro
a       c       otro
a       d       otro
a       d       OK
a       d       otro
b       c       otro
b       c       otro
b       c       otro
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
el_dandy
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2018-03-20 18:29 @811

Publicidad

Re: Problema con bucles y comparaciones

Notapor explorer » 2018-03-21 07:19 @347

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

A ver si lo he entendido: Quieres que, para todas las líneas del primer archivo, ver si la segunda columna existe en la segunda columna del segundo archivo.

Si existe, sacamos esa línea junto con un 'Ok', y sino, con un 'otro'.

¿Es eso?
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: Problema con bucles y comparaciones

Notapor el_dandy » 2018-03-21 09:02 @418

Es correcto. Eso es lo que busco.

Gracias!
el_dandy
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2018-03-20 18:29 @811

Re: Problema con bucles y comparaciones

Notapor explorer » 2018-03-21 15:45 @698

Bueno, como se trata de comprobar la existencia o no de algo, eso es tarea para un hash.

Yo leería el segundo archivo. Para todas las líneas, me quedo con la segunda columna y la meto como clave en un hash (como valor, le doy un '1', no importa mucho).

Luego, abro el primer archivo. Para todas las líneas, veo su segunda columna.

Y me pregunto si esa columna existía en el segundo archivo, de esta manera:

if (exists $segundas_columnas_segundo_archivo{ $columnas_primer_archivo[1] }) {

Si es cierto, entonces confecciono la salida de una manera, y sino, de otra.

Este problema (o parecido) se ha resuelto varias veces a lo largo de estos foros, sobre todo en el subforo de bioinformática.
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


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 7 invitados