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)

260voto

Keith Hill Points 73162

Utilice Select-Object (dont l'alias est select ) avec le -Unique interrupteur ; par exemple :

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

9 votes

C'était trop facile :-(. Dans PowerShell 2, vous pouvez également utiliser Get-Unique (ou gu ) si votre tableau est déjà trié.

2 votes

Johannes, Get-Unique est disponible dans la v1 :)

5 votes

Cool, cela fonctionne bien, juste une note, si vous voulez être concis, il pourrait être raccourci même à -u . select -u Je l'utiliserais sur une ligne de commande, mais si elle est écrite dans un code, il est suggéré d'utiliser la formulation complète de PS : Select-Object -Unique

104voto

Shay Levy Points 41404

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

$a | sort -unique

2 votes

Cela résout également mon problème suivant, à savoir comment le trier. Merci !

3 votes

Celui-ci semble aussi un peu plus rapide.

0 votes

Notez que cela ne préserve pas l'ordre des éléments, par ex. @("B", "a", "A") | sort -unique produit A B .

26voto

DarkLite1 Points 3993

Si vous voulez être totalement à l'abri des bombes, c'est ce que je vous conseille :

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

Sortie :

Apples
Banana

Cela utilise le Property au premier paramètre Trim() les chaînes de caractères, de sorte que les espaces supplémentaires sont supprimés, puis ne sélectionne que les éléments suivants -Unique valeurs.

Plus d'informations sur Sort-Object :

Get-Help Sort-Object -ShowWindow

1 votes

Réponse géniale. Elle a résolu mon problème, Get-Unique n'a pas fonctionné parce que les espaces

10voto

Briscomo Points 71
$a | sort -unique

Cela fonctionne sans tenir compte des majuscules et des minuscules, ce qui permet d'éliminer les chaînes en double dont la casse est différente. Cela a résolu mon problème.

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

$ServerList

Les sorties ci-dessus :

FS3
HQ2

0 votes

Cela fonctionne également bien pour les tableaux avec plusieurs membres

10voto

Omzig Points 206

C'est ainsi que vous obtenez l'unique d'un tableau avec deux propriétés ou plus. Le tri est vital et la clé pour que cela fonctionne correctement. Sinon, vous n'obtiendrez qu'un seul élément.

PowerShell script :

$objects = @(
    [PSCustomObject] @{ Message = "1"; MachineName = "1" }
    [PSCustomObject] @{ Message = "2"; MachineName = "1" }
    [PSCustomObject] @{ Message = "3"; MachineName = "1" }
    [PSCustomObject] @{ Message = "4"; MachineName = "1" }
    [PSCustomObject] @{ Message = "5"; MachineName = "1" }
    [PSCustomObject] @{ Message = "1"; MachineName = "2" }
    [PSCustomObject] @{ Message = "2"; MachineName = "2" }
    [PSCustomObject] @{ Message = "3"; MachineName = "2" }
    [PSCustomObject] @{ Message = "4"; MachineName = "2" }
    [PSCustomObject] @{ Message = "5"; MachineName = "2" }
    [PSCustomObject] @{ Message = "1"; MachineName = "1" }
    [PSCustomObject] @{ Message = "2"; MachineName = "1" }
    [PSCustomObject] @{ Message = "3"; MachineName = "1" }
    [PSCustomObject] @{ Message = "4"; MachineName = "1" }
    [PSCustomObject] @{ Message = "5"; MachineName = "1" }
    [PSCustomObject] @{ Message = "1"; MachineName = "2" }
    [PSCustomObject] @{ Message = "2"; MachineName = "2" }
    [PSCustomObject] @{ Message = "3"; MachineName = "2" }
    [PSCustomObject] @{ Message = "4"; MachineName = "2" }
    [PSCustomObject] @{ Message = "5"; MachineName = "2" }
)

Write-Host "Sorted on both properties with -Unique" -ForegroundColor Yellow
$objects | Sort-Object -Property Message,MachineName -Unique | Out-Host

Write-Host "Sorted on just Message with -Unique" -ForegroundColor Yellow
$objects | Sort-Object -Property Message -Unique | Out-Host

Write-Host "Sorted on just MachineName with -Unique" -ForegroundColor Yellow
$objects | Sort-Object -Property MachineName -Unique | Out-Host

Sortie :

Sorted on both properties with -Unique

Message MachineName
------- -----------
1       1          
1       2          
2       1          
2       2          
3       1          
3       2          
4       1          
4       2          
5       1          
5       2          

Sorted on just Message with -Unique

Message MachineName
------- -----------
1       1          
2       1          
3       1          
4       1          
5       2          

Sorted on just MachineName with -Unique

Message MachineName
------- -----------
1       1          
3       2  

Source : https://powershell.org/forums/topic/need-to-unique-based-on-multiple-properties/

0 votes

Pour les boucles dont vous ne connaissez pas l'en-tête (par exemple, l'analyse automatique de données csv), utilisez Sort-Object * -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