Gibt es ein Windows-Äquivalent zum Unix-Uniq?


17

Ich muss doppelte Zeilen aus einer Textdatei entfernen, es ist unter Linux einfach zu verwenden

cat file.txt |sort | uniq

wenn file.txt enthält

aaa
bbb
aaa
ccc

Es wird ausgegeben

aaa
bbb
ccc

Gibt es ein Windows-Äquivalent? oder wie geht das auf Windows?


10
Unter Unix können Sie es alssort -u file.txt
jfs

1
Es gibt auch WSL, die ziemlich gut funktioniert, was diese Art von Sachen
betrifft

Vielleicht möchten Sie etwas als Lösung festlegen, wenn Sie keine weiteren Fragen haben?
Davidbaumann

Antworten:


31

Das Sort-ObjectCmdlet in PowerShell unterstützt einen -UniqueSwitch, der Folgendes tut uniq:

Get-Content file.txt | Sort-Object -unique

Aufgrund des Vorhandenseins von Aliasnamen in PowerShell können Sie natürlich auch Folgendes schreiben:

type file.txt | sort -unique

Darüber hinaus gibt es /uniquein sort.exeWindows 10 einen undokumentierten Schalter , sodass dies in der Eingabeaufforderung funktionieren sollte:

type file.txt | sort /unique

1
Ich glaube nicht, dass der Windows-Befehl ( sort.exe) dies unterstützt. Es sieht aus wie eine Funktion der integrierten PowerShell.
Ben Voigt

1
Geben Sie unsorted.txt | ein sort -unique> sorted.txt Dies funktioniert wirklich unter win10 und schrieb eindeutige Werte in neue Datei
Lixas

7
@BenVoigt raschend, type file.txt | sort /uniquearbeitet mit undokumentierten Schalter /uniquevon sort.exeDienstprogramm (zumindest unter Windows 10). Auf der anderen Seite haben Sie Recht, dass das angegebene Beispiel Get-Content file.txt | Sort-Object -uniquetatsächlich PowerShell ist.
JosefZ

1
sort /uniqueFehler unter Invalid switch.Windows 7 Enterprise.
Don Cruickshank

1
@JosefZ, die Antwort gibt den Schalter mit "/" (Schrägstrich) und nicht mit Bindestrich an. Der Schrägstrich ist Windows-Standard für Befehle in CMD, und nicht alle Befehle ermöglichen das Ersetzen eines Schrägstrichs durch einen Schrägstrich bei Befehlsschaltern. docs.microsoft.com/en-us/windows-server/administration/… für eine Kurzreferenz zeigt konsistent Schrägstriche an. Das Obige war eine großartige Antwort, da es einen Leckerbissen gab, der nicht allgemein bekannt ist, obwohl ich mir nicht vorstellen kann, warum der Schalter "/ unique" nicht dokumentiert ist, da er so nützlich ist.
Debra

6

Es gibt Uniq-Ports, die identisch mit den Versionen gnu / coreutils funktionieren. Ich persönlich verwende die Variante von GOW, aber Git für Windows hat eine wesentlich neuere Version . Kein Cygwin erforderlich, für letzteres müssen Sie jedoch in / usr / bin suchen

Da diese Pakete auch cat, sort und uniq enthalten, sollte Ihr Workflow größtenteils identisch sein und cat file.txt |sort | uniqgrößtenteils identisch funktionieren


2

Sie können den Befehl "uniq" ganz einfach selbst schreiben. Speichern Sie dies in einer Batch-Datei "uniq.cmd" irgendwo in Ihrem% Pfad, wo% es finden kann (z. B. in% windir% \ system32). Diese Version unterscheidet NICHT zwischen Groß- und Kleinschreibung:

@echo off
setlocal DisableDelayedExpansion
set "prev="
for /f "delims=" %%F in ('sort %*') do (
    rem "set" needs to be done without delayed expansion
    set "line=%%F"
    setlocal EnableDelayedExpansion
        set "line=!line:<=<!"
        if /i "!prev!" neq "!line!" echo(!line!
        set "prev=!line!"
    endlocal
)

Dies funktioniert sowohl mit "uniq mytextfile" als auch mit "cat mytextfile | uniq". Alle Eingaben und Argumente werden einfach an den Befehl sort übergeben.

Ab Windows 7 möchten Sie möglicherweise eine Version, bei der die Groß- und Kleinschreibung beachtet wird (der Unterschied besteht darin, dass der Schalter "sort / C" und nicht "if / i" nicht dokumentiert ist):

@echo off
setlocal DisableDelayedExpansion
set "prev="
for /f "delims=" %%F in ('sort /C %*') do (
    rem "set" needs to be done without delayed expansion
    set "line=%%F"
    setlocal EnableDelayedExpansion
        set "line=!line:<=<!"
        if "!prev!" neq "!line!" echo(!line!
        set "prev=!line!"
    endlocal
)

Schön, aber es hat einige Mängel. Es scheitert derzeit mit Inhalten wie /?, ON, one ^ caretoder bang!. Aber das kann unter Verwendung der gelöst werden Makeln verzögert Expansionstechnik und echo(sehen: Dostips: ECHO. FEHLT, Text oder Leerzeile zu geben
jeb

Vielen Dank, der Grund für die Verwendung der Technik zum Umschalten der verzögerten Expansion war weder offensichtlich noch markiert. Ich habe meine Beispiele so bearbeitet, dass sie jetzt (fast) perfekt sind.
Tom Stein

0

Ergänzung zu Yu Jiaaos Antwort. Sie können das sort-objectPowershell-Cmdlet an einer Eingabeaufforderung wie folgt aufrufen:

type file.txt | powershell -nop "$input | sort -unique"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.