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-UNIQUE
Powershell 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
'bestsource' 카테고리의 다른 글
TextBlock에서 실행 사이의 공백을 제거하는 방법 (0) | 2023.04.09 |
---|---|
Windows에서의 Python os.path.join (0) | 2023.04.09 |
woocommerce 탭을 제거하는 방법 (0) | 2023.04.04 |
Java에서 http post 본문에 json을 추가하는 방법 (0) | 2023.04.04 |
Wordpress Rewrite 또는 .htaccess를 통한 URL 개서 (0) | 2023.04.04 |