Rimozione di valori duplicati da un array di PowerShell


Risposte:


193

Usa Select-Object(il cui alias è select) con l' -Uniqueopzione; per esempio:

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

9
Era troppo facile :-(. In PowerShell 2 puoi anche usare Get-Unique(o gu) se il tuo array è già ordinato.
Joey

2
Johannes, Get-Unique è disponibile nella v1 :)
Shay Levy

2
bello, funziona bene, solo una nota, se vuoi essere conciso, potrebbe essere abbreviato anche a -u. select -uLo userei su una riga di comando, ma scritto in un codice, si consiglia di utilizzare la dicitura PS completa:Select-Object -Unique
papo

Funziona solo con una cifra? Per un lungo elenco di array sembra non funzionare.
EagleDev

85

Un'altra opzione è usare Sort-Object(il cui alias è sort, ma solo su Windows) con lo
-Uniqueswitch, che combina l'ordinamento con la rimozione dei duplicati:

$a | sort -unique

2
Questo risolve anche il mio prossimo problema che è come lo risolvo. Grazie!
Utente registrato

2
Anche questo sembra un po 'più veloce.
Gneo Pompeo

7

Nel caso in cui tu voglia essere completamente bomba, questo è ciò che consiglierei:

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

Produzione:

Apples
Banana

Questo utilizza il Propertyparametro per prima cosa Trim()le stringhe, quindi gli spazi extra vengono rimossi e quindi seleziona solo i -Uniquevalori.

Maggiori info su Sort-Object:

Get-Help Sort-Object -ShowWindow

1
Risposta fantastica. Ha risolto il mio problema, Get-Uniquenon ha funzionato perché gli spazi
Kolob Canyon

7
$a | sort -unique

Funziona con case-insensitive, quindi rimuove le stringhe duplicate con casi diversi. Ho risolto il mio problema.

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

$ServerList

Le uscite di cui sopra:

FS3
HQ2

funziona bene anche per array con più membri
JoeRod


2

Con il mio metodo puoi rimuovere completamente i valori duplicati, lasciandoti con valori dall'array che avevano solo un conteggio di 1. Non era chiaro se questo fosse ciò che l'OP voleva effettivamente, tuttavia non sono riuscito a trovare un esempio di questa soluzione online quindi Ecco qui.

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

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

2

Sia che si sta utilizzando SORT -UNIQUE, SELECT -UNIQUEo GET-UNIQUEda PowerShell 2,0-5,1, tutti gli esempi forniti sono array singola colonna. Devo ancora farlo funzionare su array con più colonne per RIMUOVERE righe duplicate per lasciare singole occorrenze di una riga su dette colonne o sviluppare una soluzione di script alternativa. Invece, questi cmdlet hanno restituito solo righe in un array che si sono verificate UNA VOLTA con un'occorrenza singolare e hanno scaricato tutto ciò che aveva un duplicato. In genere devo rimuovere manualmente i duplicati dall'output CSV finale in Excel per completare il rapporto, ma a volte vorrei continuare a lavorare con tali dati all'interno di Powershell dopo aver rimosso i duplicati.


qui è dove il Where-Object torna utile. Per prima cosa restringere l'elenco utilizzando la clausola right where, quindi reindirizzarlo a un oggetto di ordinamento, selezionare una o più colonne per ordinare e dare all'oggetto di ordinamento un carattere -unico.
LPChip
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.