154 votes

Suppression des valeurs dupliquées d'un tableau PowerShell

Comment supprimer les doublons d'un tableau PowerShell ?

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

4voto

Martin Brandl Points 13712

Si la liste est triée, vous pouvez utiliser la fonction Get-Unique cmdlet :

 $a | Get-Unique

2 votes

Elle nécessite un tri préalable de la liste.

3voto

Will Points 81

Avec ma méthode, vous pouvez supprimer complètement les valeurs en double, vous laissant avec des valeurs du tableau qui n'ont qu'un compte de 1. Il n'était pas clair si c'est ce que le PO voulait réellement, mais je n'ai pas pu trouver un exemple de cette solution en ligne, alors le voici.

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

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

0 votes

J'aime beaucoup cette réponse, mais il y a un gros défaut. S'il y a plusieurs éléments avec le même nom, tous ces éléments sont perdus, il devrait plutôt en garder un. Ceci l'a corrigé : ($properties | Group-Object -NoElement).Name | Get-Unique

1voto

Que vous utilisiez SORT -UNIQUE , SELECT -UNIQUE o GET-UNIQUE De Powershell 2.0 à 5.1, tous les exemples donnés concernent des tableaux à une seule colonne. Je n'ai pas encore réussi à faire fonctionner cette fonction sur des tableaux à plusieurs colonnes à ENLEVER Dupliquer les rangées pour laisser des occurrences uniques d'une rangée à travers lesdites colonnes, ou développer une solution alternative script. Au lieu de cela, ces cmdlets n'ont renvoyé que les rangées dans un tableau qui se sont produites UNE FOIS avec une occurrence singulière et ont jeté tout ce qui avait un doublon. Typiquement, je dois supprimer les doublons manuellement de la sortie CSV finale dans Excel pour terminer le rapport, mais parfois je voudrais continuer à travailler avec lesdites données dans Powershell après avoir supprimé les doublons.

0 votes

C'est là que le Where-Object s'avère utile. Il faut d'abord réduire la liste en utilisant la clause where de droite, puis la diriger vers un objet de tri, sélectionner une ou plusieurs colonnes à trier, et donner à l'objet de tri un -unique.

1 votes

@Christopher, veuillez consulter mon message pour résoudre votre problème. Envisagez de supprimer cette réponse pour mettre de l'ordre dans les solutions.

1voto

roxton Points 271

Pour obtenir des éléments uniques d'un tableau et préserver leur ordre, vous pouvez utiliser .NET HashSet :

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

# PS>$Set
# 1
# 3
# 2

Fonctionne mieux avec les tableaux de chaînes de caractères qui contiennent à la fois des éléments en majuscules et en minuscules et pour lesquels vous devez préserver la première occurrence de chaque élément de manière insensible à la casse :

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

# PS>$Set
# B
# a

Fonctionne comme prévu avec les autres types.

Syntaxe raccourcie, compatible avec PowerShell 5.1 et plus récent :

$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)

1voto

az1d Points 51

Un grand nombre des réponses fournies donnent des résultats buggés. select -Unqiue n'est pas sensible à la casse. sort -Unique vous donne des résultats triés, que vous pourriez vouloir dans l'ordre original.

Will a donné une excellente réponse, mais elle est imparfaite car elle élimine tous les résultats en double mais oublie d'en conserver un.

Voici une version que j'ai créée et qui semble fonctionner parfaitement. Elle redonne des résultats uniques et conserve l'ordre de tri original.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X