Comment supprimer les doublons d'un tableau PowerShell ?
$a = @(1,2,3,4,5,5,6,7,8,9,0,0)
Comment supprimer les doublons d'un tableau PowerShell ?
$a = @(1,2,3,4,5,5,6,7,8,9,0,0)
Si la liste est triée, vous pouvez utiliser la fonction Get-Unique cmdlet :
$a | Get-Unique
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
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.
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.
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)
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 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.