bestsource

PowerShell 어레이에서 중복된 값 제거

bestsource 2023. 4. 9. 21:46
반응형

PowerShell 어레이에서 중복된 값 제거

PowerShell 어레이에서 중복을 제거하는 방법

$a = @(1,2,3,4,5,5,6,7,8,9,0,0)

사용(에일리어스)select)와-Unique스위치(예:

$a = @(1,2,3,4,5,5,6,7,8,9,0,0)
$a = $a | select -Unique

다른 옵션은 (에일리어스는) 를 사용하는 것입니다.sort(단, Windows에서만)를 사용하여
-Unique스위치 - 중복 제거와 정렬을 결합합니다.

$a | sort -unique

만약 당신이 폭탄에 완벽하게 대비하고 싶다면, 나는 다음과 같이 조언하고 싶다.

@('Apples', 'Apples ', 'APPLES', 'Banana') | 
    Sort-Object -Property @{Expression={$_.Trim()}} -Unique

출력:

Apples
Banana

이 명령어는Property첫 번째 파라미터Trim()여분의 공간은 삭제되고, 그 후, 이 문자열만 선택됩니다.-Unique가치.

상세 정보Sort-Object:

Get-Help Sort-Object -ShowWindow
$a | sort -unique

이것은 대소문자를 구분하지 않기 때문에 대소문자가 다른 중복 문자열을 삭제합니다.내 문제를 해결했다.

$ServerList = @(
    "FS3",
    "HQ2",
    "hq2"
) | sort -Unique

$ServerList

위의 출력은 다음과 같습니다.

FS3
HQ2

이렇게 하면 두 개 이상의 속성을 가진 어레이에서 원하는 속성을 얻을 수 있습니다.이 종류는 매우 중요하며 올바르게 작동하기 위한 열쇠입니다.그렇지 않으면 한 개의 아이템만 반품됩니다.

PowerShell 스크립트:

$objects = @(
    [PSCustomObject] @{ Message = "1"; MachineName = "1" }
    [PSCustomObject] @{ Message = "2"; MachineName = "1" }
    [PSCustomObject] @{ Message = "3"; MachineName = "1" }
    [PSCustomObject] @{ Message = "4"; MachineName = "1" }
    [PSCustomObject] @{ Message = "5"; MachineName = "1" }
    [PSCustomObject] @{ Message = "1"; MachineName = "2" }
    [PSCustomObject] @{ Message = "2"; MachineName = "2" }
    [PSCustomObject] @{ Message = "3"; MachineName = "2" }
    [PSCustomObject] @{ Message = "4"; MachineName = "2" }
    [PSCustomObject] @{ Message = "5"; MachineName = "2" }
    [PSCustomObject] @{ Message = "1"; MachineName = "1" }
    [PSCustomObject] @{ Message = "2"; MachineName = "1" }
    [PSCustomObject] @{ Message = "3"; MachineName = "1" }
    [PSCustomObject] @{ Message = "4"; MachineName = "1" }
    [PSCustomObject] @{ Message = "5"; MachineName = "1" }
    [PSCustomObject] @{ Message = "1"; MachineName = "2" }
    [PSCustomObject] @{ Message = "2"; MachineName = "2" }
    [PSCustomObject] @{ Message = "3"; MachineName = "2" }
    [PSCustomObject] @{ Message = "4"; MachineName = "2" }
    [PSCustomObject] @{ Message = "5"; MachineName = "2" }
)

Write-Host "Sorted on both properties with -Unique" -ForegroundColor Yellow
$objects | Sort-Object -Property Message,MachineName -Unique | Out-Host

Write-Host "Sorted on just Message with -Unique" -ForegroundColor Yellow
$objects | Sort-Object -Property Message -Unique | Out-Host

Write-Host "Sorted on just MachineName with -Unique" -ForegroundColor Yellow
$objects | Sort-Object -Property MachineName -Unique | Out-Host

출력:

Sorted on both properties with -Unique

Message MachineName
------- -----------
1       1          
1       2          
2       1          
2       2          
3       1          
3       2          
4       1          
4       2          
5       1          
5       2          


Sorted on just Message with -Unique

Message MachineName
------- -----------
1       1          
2       1          
3       1          
4       1          
5       2          


Sorted on just MachineName with -Unique

Message MachineName
------- -----------
1       1          
3       2  

출처: https://powershell.org/forums/topic/need-to-unique-based-on-multiple-properties/

목록이 정렬된 경우 Get-Unique cmdlet을 사용할 수 있습니다.

 $a | Get-Unique

이 방법을 사용하면 중복된 값을 완전히 제거할 수 있으며 카운트가 1인 배열에서 값을 남길 수 있습니다.이것이 OP가 실제로 원하는 것인지는 확실하지 않지만, 온라인에서는 이 솔루션의 예를 찾을 수 없었기 때문에 여기 있습니다.

$array=@'
Bananna
Apple
Carrot
Pear
Apricot
Pear
Bananna
'@ -split '\r\n'

($array | Group-Object -NoElement | ?{$_.count -eq 1}).Name

사용 여부에 관계없이SORT -UNIQUE,SELECT -UNIQUE또는GET-UNIQUEPowershell 2.0부터 5.1까지의 예는 모두 단일 컬럼 어레이에 있습니다.중복 행을 제거하기 위해 여러 열이 있는 어레이에서 이 기능을 수행하거나 다른 스크립트 솔루션을 개발하지 못했습니다.대신 이러한 cmdlet은 단일 오카렌스로 한 번 발생한 어레이 내의 행만 반환하고 중복된 모든 것을 덤프했습니다.보통 보고서를 작성하려면 Excel의 최종 CSV 출력에서 중복된 데이터를 수동으로 제거해야 하는데, 중복된 데이터를 삭제한 후에도 Powershell에서 해당 데이터를 계속 사용하고 싶은 경우가 있습니다.

제공된 답변 중 많은 부분이 애매한 결과를 가져옵니다. select -Unqiue대소문자를 구분하지 않습니다. sort -Unique는 원래 순서로 원하는 정렬된 결과를 제공합니다.

윌은 훌륭한 답변을 했지만, 중복된 결과는 모두 폐기하고 그 중 하나를 보관하는 것을 잊어버리기 때문에 결점이 있습니다.

이것은 제가 만든 완벽하게 작동하는 버전입니다.고유한 결과를 반환하고 원래 정렬 순서를 유지합니다.

($properties | Group-Object -NoElement).Name | Get-Unique

어레이에서 원하는 항목을 가져와 순서를 유지하려면 를 사용합니다.NET 해시 세트:

$Array = @(1, 3, 1, 2)
$Set = New-Object -TypeName 'System.Collections.Generic.HashSet[int]' -ArgumentList (,[int[]]$Array)

# PS> $Set
# 1
# 3
# 2

대소문자를 구분하지 않고 각 항목의 첫 번째 항목을 보존해야 하는 대소문자를 모두 포함하는 문자열 배열에서 가장 적합합니다.

$Array = @("B", "b", "a", "A")
$Set = New-Object -TypeName 'System.Collections.Generic.HashSet[string]' -ArgumentList ([string[]]$Array, [StringComparer]::OrdinalIgnoreCase)

# PS> $Set
# B
# a

다른 타입에서는 정상적으로 동작합니다.

PowerShell 5.1 이후와 호환되는 단축 구문:

$Array = @("B", "b", "a", "A")
$Set = [Collections.Generic.HashSet[string]]::new([string[]]$Array, [StringComparer]::OrdinalIgnoreCase)

$Array = @(1, 3, 1, 2)
$Set = [Collections.Generic.HashSet[int]]::new([int[]]$Array)
$a = @('D:/', 'two', 'three')
$s = "D:/"
$null -ne ($a | ? { $s -match $_ })  # Returns $true

여기서 다른 솔루션을 사용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/1391853/removing-duplicate-values-from-a-powershell-array

반응형