• Publicidad

Buscar diferencias entre dos variables de Shell

Todo lo relacionado con lenguajes de programación distintos de Perl: PHP, Java, C++, Ruby, Python, etc.

Buscar diferencias entre dos variables de Shell

Notapor Santi » 2006-04-07 09:15 @427

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" :-)

Tengo dos variables con el siguiente formato:

Código: Seleccionar todo
# 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? :-)

Gracias!!
Santi Saez
Santi
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2006-04-07 08:56 @414

Publicidad

Re: Buscar diferencias entre dos variables de Shell

Notapor explorer » 2006-04-07 10:37 @484

En shell:
Código: Seleccionar todo
#!/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: Seleccionar todo
#!/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: Seleccionar todo
#!/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: Seleccionar todo
#!/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
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

Notapor Santi » 2006-04-12 06:12 @300

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 :-)

Saludos,
Santi Saez
Santi
Perlero nuevo
Perlero nuevo
 
Mensajes: 13
Registrado: 2006-04-07 08:56 @414


Volver a Programación en general

¿Quién está conectado?

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