programing

PowerShell의 유니언과 교차로?

bestprogram 2023. 9. 4. 20:27

PowerShell의 유니언과 교차로?

다음 구조의 개체 배열이 있습니다.

structure Disk
{
  int UID;
  String Computer;
}

시스템에는 여러 개의 공유 디스크가 있을 수 있으며 디스크는 시스템 간에 공유될 수 있습니다.

저는 모든 컴퓨터에 공통된 모든 디스크를 찾고 싶습니다.예를 들어 시스템 A, B, C, 디스크 1, 2, 3이 있습니다.디스크 어레이가 {1,A}, {1,B}, {2,A}, {2,B}, {2,C}, {3,A}입니다.제가 원하는 결과는 A, B, C에 나타나기 때문에 디스크 2가 되어야 합니다.

이것을 달성할 수 있는 효과적인 방법이 있습니까?

각 루프마다 여러 개의 루프를 사용하여 달성할 수 있지만, 저는 확실히 더 나은 방법을 원합니다.교차로와 같은 작업을 생각하고 있지만 PowerShell에서 이것을 찾지 못했습니다.

가정하면$arr다음과 같이 할 수 있습니다.

$computers = $arr | select -expand computer -unique
$arr | group uid | ?{$_.count -eq $computers.count} | select name

일반적으로 저는 다음과 같이 Powershell의 조합과 교차로에 접근할 것입니다.

$a = (1,2,3,4)
$b = (1,3,4,5)
$a + $b | select -uniq    #union
$a | ?{$b -contains $_}   #intersection

그러나 당신이 요구하는 것에 대해, 위의 해결책은 잘 작동하며 용어의 표준 정의에서 결합과 교차에 대해서는 잘 작동하지 않습니다.

업데이트:

나는 다음을 제공하는 pslinq를 썼습니다.Union-List그리고.Intersect-ListPowershell과의 집합 결합 및 교차점을 달성하는 데 도움이 됩니다.

또한 할 수 있습니다.

$a = (1,2,3,4)
$b = (1,3,4,5)
Compare-Object $a $b -PassThru -IncludeEqual                   # union
Compare-Object $a $b -PassThru -IncludeEqual -ExcludeDifferent # intersection

다음과 같은 경우 작동하지 않습니다.$a하지만 null입니다.

설정 빼기(a - b)의 경우:

$a | ?{-not ($b -contains $_)}

초기 버전에서는 이 기능이 작동하지 않지만 최신 버전에서는 를 호출할 수 있습니다.NET LINQ 확장 기능은 다음과 같이 직접 작동합니다.

[system.linq.enumerable]::union([object[]](1,2,3),[object[]](2,3,4))

(일부 열거형 유형으로 캐스트하지 않으면 PowerShell은 "오버로드를 찾을 수 없음" 오류를 발생시킵니다.)

이 기능은 PowerShell V4 및 V5에서 작동하지만 V2에서는 작동하지 않습니다.V3를 사용할 수 있는 시스템이 없습니다.

저는 아무도 1, 2, 3번 디스크가 첨부된 컴퓨터 a, b, c의 구체적인 예에 답하지 않았다는 것을 깨달았습니다.교차로, 유니언 및 세 세트 간의 차이 설정에 대해 주어진 코드 및 출력

코드

$a = @(1, 2, 3)
$b = @(1, 2)
$c = @(2)

'Intersection $a ⋂ $b ⋂ $c'
$a | Where-Object {$_ -In $b} | Where-Object {$_ -In $c}

'Union $a ⋃ $b ⋃ $c'
$a + $b + $c | Select-Object -Unique

'Set difference $a - $b - $c (items in $a but not $b or $c)'
$a | Where-Object {$_ -NotIn $b} | Where-Object {$_ -NotIn $c}

산출량

Intersection $a ⋂ $b ⋂ $c
2
Union $a ⋃ $b ⋃ $c
1
2
3
Set difference $a - $b - $c (items in $a but not $b or $c)
3

언급URL : https://stackoverflow.com/questions/8609204/union-and-intersection-in-powershell