Removendo valores duplicados de uma matriz PowerShell

109

Como posso remover duplicatas de uma matriz do PowerShell?

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

Respostas:

193

Use Select-Object(cujo alias é select) com o -Uniqueswitch; por exemplo:

$a = @(1,2,3,4,5,5,6,7,8,9,0,0)
$a = $a | select -Unique
Keith Hill
fonte
9
Isso foi muito fácil :-(. No PowerShell 2, você também pode usar Get-Unique(ou gu) se sua matriz já estiver classificada.
Joey,
2
Johannes, Get-Unique está disponível na v1 :)
Shay Levy,
2
legal, isso funciona bem, apenas uma nota, se você quiser ser conciso, pode ser abreviado até para -u. select -uEu usaria isso em uma linha de comando, mas escrito em um código, é sugerido usar o texto PS completo:Select-Object -Unique
papo
Isso só funciona com um único dígito? Para uma grande lista de array parece não funcionar.
EagleDev
85

Outra opção é usar Sort-Object(cujo alias é sort, mas apenas no Windows) com a
-Uniqueopção, que combina classificação com remoção de duplicatas:

$a | sort -unique
Shay Levy
fonte
2
Isso também resolve meu próximo problema, que é como faço para classificar. Obrigado!
Usuário registrado
2
Este também parece um pouco mais rápido.
Gneo Pompeo
7

No caso de você querer ser totalmente comprovado, este é o meu conselho:

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

Resultado:

Apples
Banana

Isso usa o Propertyparâmetro para primeiro Trim()as strings, de modo que os espaços extras são removidos e, a seguir, seleciona apenas os -Uniquevalores.

Mais informações em Sort-Object:

Get-Help Sort-Object -ShowWindow
DarkLite1
fonte
1
Resposta incrível. Resolvi meu problema, Get-Uniquenão funcionou porque os espaços
Kolob Canyon
7
$a | sort -unique

Isso funciona com diferenciação de maiúsculas e minúsculas, removendo, portanto, strings duplicadas com maiúsculas e minúsculas. Resolveu meu problema.

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

$ServerList

Os resultados acima:

FS3
HQ2
Briscomo
fonte
isso também funciona bem para arrays com vários membros
JoeRod
4

Se a lista estiver classificada, você pode usar o cmdlet Get-Unique :

 $a | Get-Unique
Martin Brandl
fonte
2
Requer que a lista seja ordenada de antemão
Johny Skovdal
2

Com o meu método, você pode remover completamente os valores duplicados, deixando-o com valores da matriz que só tinham uma contagem de 1. Não estava claro se isso era o que o OP realmente queria, mas não consegui encontrar um exemplo dessa solução online, então Aqui está.

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

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

Esteja você usando SORT -UNIQUE, SELECT -UNIQUEou GET-UNIQUEdo Powershell 2.0 ao 5.1, todos os exemplos dados estão em matrizes de coluna única. Ainda preciso fazer isso funcionar em matrizes com várias colunas para REMOVER linhas duplicadas para deixar ocorrências únicas de uma linha entre essas colunas ou desenvolver uma solução de script alternativa. Em vez disso, esses cmdlets retornaram apenas linhas em uma matriz que ocorreu UMA VEZ com ocorrência singular e despejou tudo que tinha uma duplicata. Normalmente, tenho que remover as duplicatas manualmente da saída CSV final no Excel para concluir o relatório, mas às vezes gostaria de continuar trabalhando com esses dados no Powershell depois de remover as duplicatas.

Christopher M Ramos
fonte
é aqui que o Where-Object se torna útil. Você primeiro restringe a lista usando a cláusula where direita, em seguida, canaliza-a para um objeto de classificação, seleciona uma ou mais colunas para classificar e dá ao objeto de classificação um único.
LPChip de