Entfernen doppelter Werte aus einem PowerShell-Array

108

Wie kann ich Duplikate aus einem PowerShell-Array entfernen?

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

Antworten:

192

Verwenden Sie Select-Object(dessen Alias ​​ist select) mit dem -UniqueSchalter; z.B:

$a = @(1,2,3,4,5,5,6,7,8,9,0,0)
$a = $a | select -Unique
Keith Hill
quelle
9
Das war zu einfach :-(. In PowerShell 2 können Sie auch Get-Unique(oder gu) verwenden, wenn Ihr Array bereits sortiert ist.
Joey
2
Johannes, Get-Unique ist in Version 1 verfügbar :)
Shay Levy
2
cool, das funktioniert gut, nur ein Hinweis, wenn Sie prägnant sein wollen, könnte es sogar verkürzt werden -u. select -uIch würde dies auf einer Befehlszeile verwenden, aber in einem Code geschrieben, wird empfohlen, den vollständigen PS-Wortlaut zu verwenden:Select-Object -Unique
Papo
Dies funktioniert nur mit einer Ziffer? Für eine große Liste von Arrays scheint es nicht zu funktionieren.
EagleDev
84

Eine andere Option ist die Verwendung Sort-Object(deren Alias ​​ist sort, aber nur unter Windows) mit dem
-UniqueSchalter, der das Sortieren mit dem Entfernen von Duplikaten kombiniert:

$a | sort -unique
Shay Levy
quelle
2
Dies löst auch mein nächstes Problem: Wie sortiere ich es? Vielen Dank!
Registrierter Benutzer
2
Dieser sieht auch ein bisschen schneller aus.
Gneo Pompeo
7
$a | sort -unique

Dies funktioniert ohne Berücksichtigung der Groß- und Kleinschreibung. Daher werden doppelte Zeichenfolgen mit unterschiedlichen Groß- und Kleinschreibung entfernt. Mein Problem gelöst.

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

$ServerList

Die obigen Ausgaben:

FS3
HQ2
Briscomo
quelle
Dies funktioniert auch gut für Arrays mit mehreren Mitgliedern
JoeRod
6

Für den Fall, dass Sie vollständig bombenbeweis sein wollen, würde ich Folgendes raten:

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

Ausgabe:

Apples
Banana

Dies verwendet den PropertyParameter, um zuerst Trim()die Zeichenfolgen zu erstellen, sodass zusätzliche Leerzeichen entfernt werden und dann nur die -UniqueWerte ausgewählt werden.

Weitere Infos zu Sort-Object:

Get-Help Sort-Object -ShowWindow
DarkLite1
quelle
1
Tolle Antwort. Mein Problem wurde gelöst, Get-Uniqueweil Räume nicht funktionierten
Kolob Canyon
4

Wenn die Liste sortiert ist, können Sie das Cmdlet Get-Unique verwenden:

 $a | Get-Unique
Martin Brandl
quelle
2
Es erfordert, dass die Liste im Voraus sortiert wird
Johny Skovdal
2

Egal , ob Sie mit SORT -UNIQUE, SELECT -UNIQUEoder GET-UNIQUEvon Powershell 2,0-5,1, alle Beispiele gegeben sind auf einzelne Spalten - Arrays. Ich muss dies noch für Arrays mit mehreren Spalten verwenden, um doppelte Zeilen zu entfernen , um einzelne Vorkommen einer Zeile in diesen Spalten zu belassen , oder um eine alternative Skriptlösung zu entwickeln. Stattdessen haben diese Cmdlets nur Zeilen in einem Array zurückgegeben, die EINMAL mit einem einzelnen Vorkommen aufgetreten sind, und alles ausgegeben, was ein Duplikat hatte. Normalerweise muss ich Duplikate manuell aus der endgültigen CSV-Ausgabe in Excel entfernen, um den Bericht fertigzustellen. Manchmal möchte ich jedoch nach dem Entfernen der Duplikate mit diesen Daten in Powershell weiterarbeiten.

Christopher M Ramos
quelle
Hier bietet sich das Where-Object an. Sie schränken die Liste zuerst ein, indem Sie die rechts-where-Klausel verwenden, sie dann an ein Sortierobjekt weiterleiten, eine oder mehrere Spalten zum Sortieren auswählen und dem Sortierobjekt eine Eindeutigkeit geben.
LPChip
1

Mit meiner Methode können Sie doppelte Werte vollständig entfernen und so Werte aus dem Array erhalten, die nur eine Zählung von 1 hatten. Es war nicht klar, ob dies das ist, was das OP tatsächlich wollte, aber ich konnte online kein Beispiel für diese Lösung finden hier ist es.

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

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