Suppression des valeurs en double d'un tableau PowerShell

109

Comment puis-je supprimer les doublons d'un tableau PowerShell?

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

Réponses:

193

Utilisez Select-Object(dont l'alias est select) avec le -Uniquecommutateur; par exemple:

$a = @(1,2,3,4,5,5,6,7,8,9,0,0)
$a = $a | select -Unique
Keith Hill
la source
9
C'était trop simple :-(. Dans PowerShell 2, vous pouvez également utiliser Get-Unique(ou gu) si votre tableau est déjà trié.
Joey
2
Johannes, Get-Unique est disponible en v1 :)
Shay Levy
2
cool, cela fonctionne bien, juste une note, si vous voulez être concis, cela pourrait même être raccourci -u. select -uJ'utiliserais ceci sur une ligne de commande, mais écrit dans un code, il est suggéré d'utiliser le libellé PS complet:Select-Object -Unique
papo
Cela ne fonctionne qu'avec un seul chiffre? Pour une grande liste de tableaux, cela ne semble pas fonctionner.
EagleDev
86

Une autre option consiste à utiliser Sort-Object(dont l'alias est sort, mais uniquement sous Windows) avec le
-Uniquecommutateur, qui combine le tri et la suppression des doublons:

$a | sort -unique
Shay Levy
la source
2
Cela résout également mon prochain problème, à savoir comment le trier. Merci!
Utilisateur enregistré
2
Celui-ci a également l'air un peu plus rapide.
Gneo Pompeo
7

Au cas où vous voudriez être complètement bombardé, voici ce que je vous conseillerais:

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

Production:

Apples
Banana

Cela utilise le Propertyparamètre pour commencer par Trim()les chaînes, donc les espaces supplémentaires sont supprimés, puis ne sélectionne que les -Uniquevaleurs.

Plus d'infos sur Sort-Object:

Get-Help Sort-Object -ShowWindow
DarkLite1
la source
1
Réponse géniale. Résolu mon problème, Get-Uniquen'a pas fonctionné parce que les espaces
Kolob Canyon
7
$a | sort -unique

Cela fonctionne avec insensible à la casse, supprimant ainsi les chaînes en double avec des cas différents. J'ai résolu mon problème.

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

$ServerList

Les sorties ci-dessus:

FS3
HQ2
Briscomo
la source
cela fonctionne également bien pour les tableaux avec plusieurs membres
JoeRod
4

Si la liste est triée, vous pouvez utiliser l' applet de commande Get-Unique :

 $a | Get-Unique
Martin Brandl
la source
2
Il faut que la liste soit triée au préalable
Johny Skovdal
2

Avec ma méthode, vous pouvez supprimer complètement les valeurs en double, vous laissant avec des valeurs du tableau qui ne comptaient que 1. Il n'était pas clair si c'était ce que l'OP voulait réellement, mais je n'ai pas pu trouver un exemple de cette solution en ligne, donc C'est ici.

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

($array | Group-Object -NoElement | ?{$_.count -eq 1}).Name
Volonté
la source
2

Que vous utilisiez SORT -UNIQUE, SELECT -UNIQUEou GET-UNIQUEde Powershell 2.0 à 5.1, tous les exemples donnés sont sur des tableaux de colonnes simples. Je n'ai pas encore réussi à faire fonctionner cela sur des tableaux avec plusieurs colonnes pour SUPPRIMER les lignes en double pour laisser des occurrences uniques d'une ligne à travers lesdites colonnes, ou développer une solution de script alternative. Au lieu de cela, ces applets de commande n'ont renvoyé que des lignes dans un tableau qui se sont produites UNE FOIS avec une occurrence singulière et ont vidé tout ce qui avait un doublon. En règle générale, 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.

Christopher M Ramos
la source
c'est là que le Where-Object est utile. Vous réduisez d'abord la liste en utilisant la clause where right, puis dirigez-la vers un objet de tri, sélectionnez une ou plusieurs colonnes à trier et donnez à l'objet de tri un -unique.
LPChip