Removendo valores duplicados de uma matriz PowerShell


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

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

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

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

isso também funciona bem para arrays com vários membros
JoeRod


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

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.


é 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.