Gibt es ein Windows-Äquivalent zum Unix uniq?

Ich muss doppelte Zeilen aus einer Textdatei entfernen, es ist einfach in Linux mit

cat file.txt |sort | uniq

Wenn die Datei.txt enthält

aaa
bbb
aaa
ccc

Es wird ausgegeben

aaa
bbb
ccc

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

Author: Yu Jiaao, 2018-04-23

4 answers

Das Cmdlet Sort-Object in PowerShell unterstützt einen Schalter -Unique, der dasselbe tut wie uniq:

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

Natürlich können Sie aufgrund des Vorhandenseins von Aliasnamen in PowerShell auch schreiben:

type file.txt | sort -unique

Zusätzlich gibt es einen undokumentierten /unique Schalter in sort.exe von Windows 10, also sollte dies in der Eingabeaufforderung funktionieren:

type file.txt | sort /unique
 35
Author: Yu Jiaao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-05-13 09:43:18

Es gibt uniq-Ports, die identisch mit den gnu/Coreutils-Versionen funktionieren. Ich persönlich benutze die Variation von GOW aber git für Windows hat eine deutlich neuere Version. Keine cygwin benötigt, obwohl für letztere müssen Sie sich im /usr/ - bin -

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

 6
Author: Journeyman Geek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-04-23 08:20:08

Sie können den Befehl "uniq" ganz einfach selbst schreiben. Speichern Sie dies in einer batch-Datei "uniq.cmd " irgendwo in Ihrem %path% kann es finden (zB in %windir%\system32). Diese Version ist NICHT Groß - / 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 mit" uniq mytextfile "sowie" cat mytextfile | uniq"; da alle Eingaben und Argumente einfach an den Sortierbefehl übergeben werden.

Ab Windows 7 möchten Sie möglicherweise eine wirklich groß-und Kleinschreibung sensitive Version (der Unterschied ist undokumentiert zwischen "sort / C" und nein " if /i"):

@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
)
 2
Author: Tom Stein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-01-17 15:51:21

Zusätzlich zu Yu Jiaaos Antwort. Sie können die aufrufen sort-object powershell-Cmdlet in einer Eingabeaufforderung wie:

type file.txt | powershell -nop "$input | sort -unique"
 1
Author: snipsnipsnip,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-04-27 07:18:40