2017-01-24 8 views
1

Ich versuche eine Powershell-Befehlszeile zu finden, die in einer Textdatei liest, alle duplizierten Zeilen (2+) entfernt und keine der doppelten Zeilen behält. Ich konnte nirgendwo auf Stackoverflow oder anderswo eine Antwort auf meine Frage finden. Jedes Beispiel, das ich bisher gefunden habe, zeigt nur das Entfernen einer und/oder vieler der duplizierten Zeilen und das Beibehalten eines.Powershell - Entfernen aller doppelten Einträge

Ist dies durch Powershell 2.0 möglich?

Powershell-Befehl Beispiel:

Get-Content "C:\Temp\OriginalFile.txt" | select -unique| Out-File "C:\Temp\ResultFile.txt" 

OriginalFile.txt

1 
1 
1 
2 
2 
3 
4 

ResultFile.txt (Actual)

1 
2 
3 
4 

ResultsFile.txt (Gewünschtes)

3 
4 

Antwort

0

pSV2:

$f = 'C:\Temp\OriginalFile.txt' 

Get-Content $f | Group-Object | ? { $_.Count -eq 1 } | Select-Object -ExpandProperty Name 

pSV3 + für eine sauberere und prägnanter Lösung ermöglicht:

Get-Content $f | Group-Object | ? Count -eq 1 | % Name 

Der Kürze halber verwenden, um die Befehle eingebaute -in Aliasen ? (für Where-Object) und % (für ForEach-Object).

Weder Select-Object -Unique noch Get-Unique scheinbar erlauben die Ausgabe auf Singletons in der Eingangs beschränken (Standard-Unix-Dienstprogramm uniq hat ein solches Feature eingebaut: uniq -u), so dass ein anderer Ansatz erforderlich ist.

Die obige Group-Object -basierte Lösung kann nicht effizient sein, aber es ist bequem:

  • Linien sind mit identischem Inhalt gruppiert, Objekte ergeben, dass jede Gruppe darstellen.

  • ? { $_.Count -eq 1 } die Filter die Gruppen auf diejenigen, die nur 1 Mitglied haben, in der Tat Ausschneiden aller doppelten Zeilen.

  • Select-Object -ExpandProperty Name wandelt dann die gefilterten Gruppenobjekte zurück in die Eingabezeile, für die sie stehen.

+0

Vielen Dank für die Antwort. Ich habe das aufgrund Ihrer Antwort funktioniert. –

+0

Ich musste 'Select-Object -Expand Name' in' Select-Object -ExpandProperty Name' ändern –

+0

@packetloss: Guter Punkt: Der vollständige Parametername ist '-ExpandProperty', und in Skripten sollte man unbedingt den vollen Parameter verwenden Namen (obwohl '-Expand' auch funktioniert hätte) - Antwort aktualisiert. – mklement0

Verwandte Themen