Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Buscar diferencias entre dos variables de Shell

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Programación en General
Mensaje Vie Abr 07, 2006 8:15 am
Santi
Perlero Nuevo
Perlero Nuevo
Registrado: 07 Abr 2006
Mensajes: 13
Buscar diferencias entre dos variables de Shell Responder citando

Buenas,

Quería resolver un pequeño problema con un shell script en BASH a ser posible, y si no fuera posible hacerlo en BASH utilizar un pequeño "perl on liner" Smile

Tengo dos variables con el siguiente formato:

Código:

# echo $VAR_1
1 101 102 103 104 105 107 108 109 110 111 114 116 117 121 122 123

# echo $VAR_2
1 101 102 104 105 106 107 108 109 110 111 113 114 115 116 117 121


Lo que busco es encontrar los datos que no aparecen en las dos variables, es decir, la diferencia. Había pensado en el comando "diff", pero no me gustaria utilizar ficheros temporales en donde redirigir la salida, etc.. para algo tan simple como lo que quiero hacer.

¿Se os ocurre alguna forma de solucionar esto con un shell script? Si no es posible tiraré de Perl.. alguna pista? Smile

Gracias!!
Mensaje Vie Abr 07, 2006 9:37 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4104
Ubicación: Valladolid, España
Responder citando

En shell:
Código:
#!/bin/bash

VAR_1="1 101 102 103 104 105 107 108 109 110 111 114 116 117 121 122 123"
VAR_2="1 101 102 104 105 106 107 108 109 110 111 113 114 115 116 117 121"

for i in $VAR_1
do
        V1[$i]=$i
done

for i in $VAR_2
do
        V2[$i]=$i
done

echo "Lo que hay en V1 pero no en V2"
for i in $VAR_1
do
        if [ -z ${V2[$i]} ]
        then
                echo $i
        fi
done

echo "Lo que hay en V2 pero no en V1"
for i in $VAR_2
do
        if [ -z ${V1[$i]} ]
        then
                echo $i
        fi
done
En Perl:
Código:
#!/usr/bin/perl

$VAR_1="1 101 102 103 104 105 107 108 109 110 111 114 116 117 121 122 123";
$VAR_2="1 101 102 104 105 106 107 108 109 110 111 113 114 115 116 117 121";

for $i ( split ' ',$VAR_1 )
{
        $V1[$i]=$i
}

for $i ( split ' ',$VAR_2 )
{
        $V2[$i]=$i
}

print "Lo que hay en V1 pero no en V2\n";
for $i ( split ' ',$VAR_1 )
{
        if ( ! $V2[$i] )
        {
                print "$i\n"
        }
}

print "Lo que hay en V2 pero no en V1\n";
for $i ( split ' ',$VAR_2 )
{
        if ( ! $V1[$i] )
        {
                print "$i\n"
        }
}
En Perl un poco más oscuro:
Código:
#!/usr/bin/perl

%VAR_1 = map { $_, 1 } split " ","1 101 102 103 104 105 107 108 109 110 111 114 116 117 121 122 123";
%VAR_2 = map { $_, 1 } split " ","1 101 102 104 105 106 107 108 109 110 111 113 114 115 116 117 121";

print "Lo que hay en V1 pero no en V2\n";
foreach ( sort keys %VAR_1 ) {
  print "$_\n" unless $VAR_2{$_};
}

print "Lo que hay en V2 pero no en V1\n";
foreach ( sort keys %VAR_2 ) {
  print "$_\n" unless $VAR_1{$_};
}
No reinventar la rueda:
Código:
#!/usr/bin/perl
use Array::Diff;
@var1 = qw(1 101 102 103 104 105 107 108 109 110 111 114 116 117 121 122 123);
@var2 = qw(1 101 102 104 105 106 107 108 109 110 111 113 114 115 116 117 121);
$diferencia = Array::Diff->diff( \@var1, \@var2 );
print "Lo que hay en 2 pero no en 1: ", join(" ", $diferencia->added), "\n";
print "Lo que hay en 1 pero no en 2: ", join(" ", $diferencia->deleted), "\n";
Array::Diff
Algorithm::Diff
Mensaje Mie Abr 12, 2006 5:12 am
Santi
Perlero Nuevo
Perlero Nuevo
Registrado: 07 Abr 2006
Mensajes: 13
Responder citando

Hola explorer,

Muchas gracias por los ejemplos, me sirve perfectamente la solución en shell script, no se me había ocurrido utilizar arrays..

Lastima que el script este escrito en shell script, las soluciones en Perl me han gustado bastante mas aparte de ser mucho mas legibles Smile

Saludos,
Publicar nuevo tema   Responder al tema    Foros de discusión -> Programación en General Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group