2011-06-16 15 views
41

que quería una pequeña lógica para comparar el contenido de dos matrices & obtener el valor que no es común entre ellos utilizando PowerShellLa comparación de dos matrices y obtener los valores que no son comunes

ejemplo, si

[email protected](1,2,3,4,5) 
[email protected](1,2,3,4,5,6) 

$ c, que es la salida, debería darme el valor "6", que es la salida de lo que es el valor poco común entre ambas matrices.

¡Puede alguien ayudarme con lo mismo! ¡Gracias!

+0

Es que Perl? Esta página del libro de cocina de Perl tiene una buena información al respecto: http://docstore.mik.ua/orelly/perl/cookbook/ch04_09.htm –

+0

Hola, Daniel. Quiero que se haga lo mismo en PowerShell – PowerShell

Respuesta

80
PS > $c = Compare-Object -ReferenceObject (1..5) -DifferenceObject (1..6) -PassThru 
PS > $c 
6 
+0

Una nota para aquellos que intentan comparar las colecciones de Keys de dos tablas hash: Asumí que las colecciones de Keys eran como matrices y que podía usar Compare-Object para compararlas. Resulta que Compare-Object ve cada colección de claves como un solo objeto, por lo que devuelve un resultado que indica que _ ** todas las claves ** en hashtable faltan en la tabla hash dos y viceversa. Para que funcione, tuve que convertir las colecciones de Keys en matrices. La forma más rápida que he encontrado es: '$ keys = @ ($ Null) * $ ht.Keys.Count' para inicializar una matriz del tamaño correcto y luego' $ ht.Keys.CopyTo ($ keys, 0) 'para copia las llaves a la matriz. –

15

Mira Compare-Object

Compare-Object $a1 $b1 | ForEach-Object { $_.InputObject } 

O si le gustaría saber dónde está el objeto pertenece a, y luego mirar SideIndicator:

[email protected](1,2,3,4,5,8) 
[email protected](1,2,3,4,5,6) 
Compare-Object $a1 $b1 
+6

Agregando la opción -PassThru lo hace salir mejor. Compare-Object $ a1 $ b1 -PassThru – MonkeyWrench

+0

Según lo que puedo ver, 'Compare-Object $ a1 $ b1 | Para cada objeto {$ _. InputObject} 'y' Compare-Object $ a1 $ b1 -PassThru' parecen producir resultados idénticos. Por supuesto, la opción -PassThru es más concisa. –

0

Esto debería ayudar, utiliza la tabla hash simple.

[email protected](1,2,3,4,5) [email protected](1,2,3,4,5,6) 


$hash= @{} 

#storing elements of $a1 in hash 
foreach ($i in $a1) 
{$hash.Add($i, "present")} 

#define blank array $c 
$c = @() 

#adding uncommon ones in second array to $c and removing common ones from hash 
foreach($j in $b1) 
{ 
if(!$hash.ContainsKey($j)){$c = $c+$j} 
else {hash.Remove($j)} 
} 

#now hash is left with uncommon ones in first array, so add them to $c 
foreach($k in $hash.keys) 
{ 
$c = $c + $k 
} 
+0

Dejando fuera el estilo de codificación cuestionable, el uso de hashtables como sustituto del operador -contains no está bien. Lo peor es que esta solución no agrega nada a comparar-objeto. – dmitry

2

Probar:

[email protected](1,2,3,4,5) 
[email protected](1,2,3,4,5,6) 
(Compare-Object $a1 $b1).InputObject 

O bien, puede utilizar:

(Compare-Object $b1 $a1).InputObject 

El orden no importa.

+0

¿Por qué esta respuesta es mala? Es más simple que usar una tabla hash. –

4

Tus resultados no serán útiles a menos que los arrays se hayan ordenado por primera vez. Para ordenar una matriz, ejecútela a través de Sort-Object.

$x = @(5,1,4,2,3) 
$y = @(2,4,6,1,3,5) 

Compare-Object -ReferenceObject ($x | Sort-Object) -DifferenceObject ($y | Sort-Object) 
+1

-SyncWindow ayuda con "qué tan lejos mirar en la matriz para la coincidencia" – Garrett

+1

No, la ordenación no es necesaria: 'Compare-Object $ x $ y' devolverá el mismo resultado que el anterior, mostrando que falta 6 de la referencia formación. (Lo comprobé tanto a partir de la versión de PS de hoy (5.1) como de la versión de PS 3.) –

9

$a | Where {$b -NotContains $_} # Devuelve los elementos en $b faltan en $a

$b | Where {$a -NotContains $_} # Devuelve los elementos en $a faltan en $b

Cuestiones relacionadas