2011-06-16 8 views
41

chciałem mały logiki, aby porównać zawartość dwóch tablic & uzyskać wartość, która nie jest powszechne wśród nich za pomocą PowerShellPorównywanie dwóch tablic i uzyskać wartości, które nie są wspólne

przykład jeśli

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

$ c, który jest wynikiem, powinno dać mi wartość "6", która jest wynikiem tego, co jest niecodzienną wartością między obydwoma tablicami.

Czy ktoś może mi pomóc z tym samym! dzięki!

+0

Czy Perl? Ta strona z książki kucharskiej Perla ma dobre informacje na ten temat: http://docstore.mik.ua/orelly/perl/cookbook/ch04_09.htm –

+0

cześć daniel chcę, żeby to samo zostało zrobione w Power Shell – PowerShell

Odpowiedz

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

Uwaga dla osób próbujących porównać kolekcje Keys dwóch hokerów: zakładałem, że kolekcje Keys są podobne do tablic i że mogę użyć porównania-obiektu, aby je porównać. Okazuje się, że Compare-Object widzi każdą kolekcję Keys jako pojedynczy obiekt, więc zwraca wynik wskazujący na _ ** wszystkie ** _ klucze w hashtable, których brakuje w hashtable dwa i vice versa. Aby go uruchomić, musiałem przekonwertować kolekcje Keys na tablice. Najszybszym sposobem, jaki znalazłem, jest: '$ keys = @ ($ Null) * $ ht.Keys.Count', aby zainicjować tablicę o właściwym rozmiarze, a następnie' $ ht.Keys.CopyTo ($ keys, 0) 'to skopiuj klawisze do tablicy. –

15

Spójrz na Compare-Object

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

Lub jeśli chcesz wiedzieć, gdzie obiekt należący do, a następnie spojrzeć na SideIndicator:

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

Dodanie opcji -PassThru sprawia, że ​​wyjście jest ładniejsze. Porównaj obiekt $ a1 $ b1 -PassThru – MonkeyWrench

+0

Z tego, co widzę, 'Porównaj obiekt $ a1 $ b1 | ForEach-Object {$ _. InputObject} 'i' Compare-Object $ a1 $ b1 -PassThru' wydają się wytwarzać identyczne dane wyjściowe. Oczywiście opcja -PassThru jest bardziej zwięzła. –

0

To powinno pomóc, wykorzystuje prostą tabelę hash.

[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

Pozostawienie wątpliwego stylu kodowania przy użyciu hashtables jako substytutu operatora -contains nie jest w porządku. Najgorsze, to rozwiązanie nie dodaje niczego do porównania-obiektu. – dmitry

2

Spróbuj:

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

Lub można użyć:

(Compare-Object $b1 $a1).InputObject 

Kolejność nie ma znaczenia.

+0

Dlaczego ta odpowiedź jest zła? Jest to prostsze niż użycie tabeli mieszania. –

4

Twoje wyniki nie będą pomocne, chyba że tablice zostaną najpierw posortowane. Aby posortować tablicę, przeprowadź ją przez 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 pomaga z "jak daleko szukać w tablicy dla dopasowania" – Garrett

+1

Nie, sortowanie nie jest _ wymagane: 'Porównaj-Obiekt $ x $ y' zwróci ten sam wynik co powyżej, pokazując, że brakuje 6 w referencji szyk. (Sprawdziłem to zarówno od dzisiejszej wersji PS (5.1), jak i PS w wersji 3.) –

9

$a | Where {$b -NotContains $_} # Zwraca elementy, które w $b brakuje w $a

$b | Where {$a -NotContains $_} # zyski, które pozycje $a brakuje w $b

Powiązane problemy