Vie Abr 07, 2006 8:15 am
|
 |
Santi
Perlero Nuevo

|
Registrado: 07 Abr 2006
Mensajes: 13
|
|
| Buscar diferencias entre dos variables de Shell |
|
|
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: |
# 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!! |
|
|
|

Vie Abr 07, 2006 9:37 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4140
Ubicación: Valladolid, España
|
|
|
|
|
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 |
|

Mie Abr 12, 2006 5:12 am
|
 |
Santi
Perlero Nuevo

|
Registrado: 07 Abr 2006
Mensajes: 13
|
|
|
|
|
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, |
|
Powered by phpBB © 2001, 2005 phpBB Group
|