powershell比较多个数组

时间:2015-03-25 15:21:29

标签: 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"

3 个答案:

答案 0 :(得分:4)

一个可行的解决方案可能是使用arco444建议的-notcontains运算符,循环遍历$a数组元素并检查它们是否至少包含在其他一个数组中。

这是一段代码

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

答案 1 :(得分:1)

这样的东西?

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

如果您只想获得原始对象:

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

答案 2 :(得分: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元素:

$a -notmatch $b_regex 

faf
abd
steyn
gupt
baz
kane
benn
brendn
joyc

对于不在$ c中的$ a元素:

$a -notmatch $c_regex

kohl
gupt
baz
kane
benn
brendn
joyc

对于不在$ b或$ c中的$ a元素:

$a -notmatch $b_regex -notmatch $c_regex

gupt
baz
kane
benn
brendn
joyc

Runtime Regex

注意:这仅用于为发表评论的人员进行演示。这比-contains / -notcontains解决方案快得多,但对于单个实例的比较,它可能有点过分。它可以在循环中产生显着的性能提升,您可以将一个数组与许多其他数组进行比较。