Daten sortieren mit PowerShell

    Sortieren in PowerShellWie die meisten Kommando-Interpreter und Script-Sprachen verfügt auch PowerShell über die Mittel, um den Inhalt von Dateien oder die Ausgabe von Befehlen zu sortieren. Sie beschränkt sich jedoch nicht auf die numerische oder alphabetische Sortierung von Zeilen, son­dern kann diese Aufgabe auch auf Basis von Objekteigenschaften erledigen.

    In einer einfachen Anwendung verhält sich das Cmdlet Sort-Object genauso wie sort.exe auf der alten Kommandozeile. So kann man ihm den Inhalt einer Textdatei über ein Pipe weiterleiten, den es dann zeilenweise aufsteigend sortiert:

    Get-Content .\namen.txt | sort

    Dieses Beispiel verwendet das vordefinierte Alias sort für Sort-Object, um den Inhalt der Datei namen.txt in alphabetischer Reihenfolge auszugeben. Soll die Sortierung absteigend erfolgen, gibt man zusätzlich den Schalter -Descending an. Standardmäßig ignoriert PowerShell Groß- und Kleinschreibung, aber wenn man diese beim Sortieren berücksichtigen möchte, dann fügt man den Parameter -CaseSensitive hinzu.

    Dubletten entfernen

    PowerShell verfügt mit Get-Unique zwar über ein eigenes Cmdlet, um Dubletten aus sortierten Listen zu entfernen. Wenn aber Daten ohnehin erst sortiert werden müssen, dann kann Sort-Object mehrfache Vorkommnisse eines bestimmten Eintrags gleich selbst eliminieren. Zu diesem Zweck verwendet man den Parameter -unique.

    Gibt ein Kommando eine Sammlung von Objekten aus, dann repräsentiert jede Spalte in der tabellarischen Darstellung eine Eigenschaft. Das gilt etwa beim Auflisten aller Dateien in einem Verzeichnis mit Get-ChildItem, das per Voreinstellung neben dem Namen auch Angaben wie Größe, das Datum des letzten Schreibzugriffs oder die Dateiattribute anzeigt.

    In solchen Fällen, die etwa auch beim Output von Get-Process oder Get-Service vorliegen, kann das Ergebnis entweder unsortiert oder nach einer beliebigen Eigenschaft sortiert sein. Wenn man die Reihenfolge anhand bestimmter Attribute jedoch selbst bestimmen möchte, dann kann man das mit sort über den Parameter -Property tun:

    gci .\documents -force | sort -property extension

    In diesem Beispiel werden die Dateien im Ordner documents nach ihrer Namenserweiterung sortiert. Möchte man die aktiven Prozesse nach ID anordnen, dann hilft dieser Befehl:

    Get-Process | sort -property ID

    Hier erkennt Sort-Object automatisch, dass ID vom Typ integer ist und sortiert die Ausgabe nach dem numerischen Wert der ID. Würde man sich aber aus irgend einem Grund wünschen, dass der Output über die Spalte ID alphabetisch geordnet wird, dann müsste man den Datentyp durch einen Cast auf String konvertieren:

    Get-Process | sort {[string]$_.ID}

    Sortieren von CSV-Dateien

    PowerShell zeigt diese Fähigkeiten nicht nur bei Daten, die als strukturierte Ausgabe von anderen Cmdlets vorliegen. Vielmehr versteht es den internen Aufbau mehrerer Dateiformate, so dass deren Inhalt nach gleichen Muster sortiert werden kann. Dies gilt etwa für CSV-Dateien, die man mit dem Cmdlet Import-Csv einlesen und parsen kann. Anschließend lässt sich ihr Inhalt anhand der Spaltenüberschriften sortieren:

    Import-Csv .\email-subscribers.csv | sort Status

    Dieser Befehl würde eine Mailing-Liste, die als CSV-Datei vorliegt, nach der Spalte mit der Überschrift Status sortieren. Möchte man das Ergebnis in eine Datei schreiben, dann könnte man es über eine Pipe an Set-Content weiterleiten.

    Textdateien in Spalten auftrennen und sortieren

    Aber selbst wenn Textdateien in keinem definierten Format wie CSV vorliegen, dann kann man immer noch Spalten extrahieren und deren Inhalt sortieren. Angenommen, man habe eine Liste von Mail-Adressen und möchte wissen, aus wie vielen Domänen diese stammen:

    Get-Content .\maildat.txt | foreach{($_.split("@"))[1]} | sort -unique | measure

    Dieser Befehl liest den Inhalt der Datei maildat.txt ein und trennt die Mail-Adressen mit split() ähnlich wie der Unix-Befehl cut anhand des Delimiters '@'auf. Die Bestandteile der zerlegten Zeilen liegen als Elemente eines Arrays vor, aus dem man die 2. Spalte entnimmt (über den Index 1, weil die Zählung ja bei 0 beginnt). Anschließend entfernt man über sort -unique alle Dubletten und ermittelt über measure die Zahl der verbliebenen Einträge.

    Keine Kommentare