2015-03-25 7 views
0

У меня есть случай, когда нужно сравнивать несколько массивов. Существует один главный массив, содержащий все элементы, которые имеют дочерние массивы, а также некоторые дополнительные элементы.powershell Сравнение нескольких массивов

В приведенном ниже примере $a является основным массивом и $b, $c являются дочерними массивами. Мне нужно сравнить эти массивы и получить список этих дополнительных элементов в $a, которые нет в $b и $c. Практически в моем случае имеется 10 дочерних массивов и массив.

$a="dhaw","roh","kohl","faf","abd","steyn","gupt","baz","kane","benn","brendn","joyc" 
$b="roh","dhaw","kohl" 
$c="steyn","abd","faf","roh","dhaw" 
+2

Вы пробовали что-нибудь? –

+0

Я знаю об объекте compare, но, похоже, работает только для 2 массивов. Я читал, что регулярное выражение может быть полезным в этом случае, но мало что знает о том, как это работает. – Kumar

+1

Вам нужно посмотреть на использование оператора '-contains' или' -notcontains' для массива subject и элемента массива, который вы хотите проверить – arco444

ответ

4

жизнеспособное решение может быть с помощью оператора -notcontains как предложено arco444, цикл через $a элементов массива и проверить, если они содержатся, по крайней мере в одном из других массивов.

Вот кусочек кода

foreach($a_value in $a) { 
    if (($b -notcontains $a_value) -and ($c -notcontains $a_value)) { 
     "$a_value is extra" 
    } 
} 
1

Что-то вроде этого?

Compare-Object -ReferenceObject $a -DifferenceObject ($b + $c) 

Если вы просто хотите, чтобы получить исходные объекты:

(Compare-Object -ReferenceObject $a -DifferenceObject ($b + $c) | 
    Where-Object {$_.SideIndicator -eq '<='}).InputObject 
1

Регулярное выражение Решение:

$a="dhaw","roh","kohl","faf","abd","steyn","gupt","baz","kane","benn","brendn","joyc" 
$b="roh","dhaw","kohl" 
$c="steyn","abd","faf","roh","dhaw" 

$b_regex = ‘(?i)^(‘ + (($b |foreach {[regex]::escape($_)}) –join “|”) + ‘)$’ 
$c_regex = ‘(?i)^(‘ + (($c |foreach {[regex]::escape($_)}) –join “|”) + ‘)$’ 

Тогда для элементов $ а, которые не в $ B:

$a -notmatch $b_regex 

faf 
abd 
steyn 
gupt 
baz 
kane 
benn 
brendn 
joyc 

Для элементов $ a, не входящих в $ c:

$a -notmatch $c_regex 

kohl 
gupt 
baz 
kane 
benn 
brendn 
joyc 

А для элементов $ а, которые не в $ B или $ C:

$a -notmatch $b_regex -notmatch $c_regex 

gupt 
baz 
kane 
benn 
brendn 
joyc 

Runtime Regex

Примечание: это только при условии, для демонстрации для людей, которые оставили комментарии об этом. Это значительно быстрее, чем решения -contains/-notcontains, но для сравнения одного экземпляра это, вероятно, слишком велико. Он может обеспечить значительный прирост производительности внутри цикла, в котором вы сравниваете один массив со многими другими массивами.

Смежные вопросы