Czy istnieje system Windows równoważny z Uniksem Uniq?

17

Potrzebuję usunąć zduplikowane linie z pliku tekstowego, w Linuksie jest to proste

cat file.txt |sort | uniq

gdy plik.txt zawiera

aaa
bbb
aaa
ccc

Wyjdzie

aaa
bbb
ccc

Czy istnieje odpowiednik systemu Windows? lub jak to zrobić w sposób Windows?

Yu Jiaao
źródło
10
Na Unixie możesz napisać to jakosort -u file.txt
jfs
1
Istnieje również WSL, który działa całkiem dobrze, o ile chodzi o tego rodzaju rzeczy
2813274
Może chcesz ustawić coś jako rozwiązanie, jeśli nie masz dalszych pytań?
davidbaumann

Odpowiedzi:

31

Polecenie Sort-Objectcmdlet w programie PowerShell obsługuje -Uniqueprzełącznik, który robi to samo, co uniq:

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

Oczywiście, dzięki obecności aliasów w PowerShell, możesz także napisać:

type file.txt | sort -unique

Ponadto /uniquew sort.exesystemie Windows 10 znajduje się nieudokumentowany przełącznik , więc powinno to działać w wierszu polecenia:

type file.txt | sort /unique
Yu Jiaao
źródło
1
Nie sądzę, aby polecenie Windows ( sort.exe) to obsługiwało; wygląda jak funkcja wbudowana w PowerShell.
Ben Voigt,
1
wpisz unsorted.txt | sort -unique> sorted.txt To naprawdę działa pod Win10 i zapisało unikalne wartości do nowego pliku
Lixas
7
@BenVoigt dziwnego, że type file.txt | sort /uniquewspółpracuje z nieudokumentowanych przełącznika /uniquez sort.exenarzędzia (przynajmniej na systemie Windows 10). Z drugiej strony masz rację, że podanym przykładem jest PowerShell Get-Content file.txt | Sort-Object -unique.
JosefZ
1
sort /uniquebłędy z Invalid switch.Windows 7 Enterprise.
Don Cruickshank
1
@JosefZ, odpowiedź określa przełącznik za pomocą „/” (ukośnik do przodu), a nie myślnik; ukośnik do przodu jest standardem Windows dla poleceń w CMD i nie wszystkie polecenia pozwalają na zastąpienie myślnika ukośnikiem na przełącznikach poleceń. docs.microsoft.com/en-us/windows-server/administration/... w celu szybkiego zapoznania się konsekwentnie pokazuje ukośniki. Powyższe było świetną odpowiedzią, dzieląc smakołyk, który nie jest powszechnie znany, choć nie mogę sobie wyobrazić, dlaczego przełącznik „/ unique” jest nieudokumentowany, ponieważ jest tak użyteczny.
Debra
6

Istnieją porty uniq, które działają identycznie jak wersje GNU / Coreutils. Osobiście używam odmiany GOW, ale git dla Windows ma znacznie nowszą wersję . Nie wymaga to jednak cygwina. W przypadku tych ostatnich należy zajrzeć do katalogu / usr / bin

Ponieważ te pakiety zawierają również cat, sort i uniq - przepływ pracy powinien być w większości identyczny i cat file.txt |sort | uniqpowinien działać w większości identycznie

Journeyman Geek
źródło
2

Możesz łatwo samodzielnie napisać polecenie „uniq”. Zapisz to w pliku wsadowym „uniq.cmd” gdzieś w% path% może go znaleźć (np. W% windir% \ system32). W tej wersji NIE jest rozróżniana wielkość liter:

@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
)

Działa to z „uniq mytextfile” oraz „cat mytextfile | uniq”; ponieważ wszystkie dane wejściowe i argumenty są po prostu przekazywane do polecenia sortowania.

Począwszy od systemu Windows 7, możesz chcieć naprawdę rozróżniać małe i wielkie litery (różnicą jest nieudokumentowany przełącznik „sort / C” i brak „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
)
Tom Stein
źródło
Fajnie, ale ma pewne wady. Obecnie nie z treści, takie jak /?, ON, one ^ caretlub bang!. Ale można to rozwiązać za pomocą przełączającej techniki opóźnionej ekspansji i echo(zobacz: Dostips: ECHO. NIE MOŻE podać tekstu lub pustej linii
jeb
Dzięki, powód użycia techniki przełączania opóźnionego rozszerzenia nie był oczywisty ani wyraźny. Zredagowałem moje przykłady, aby były (prawie) idealne.
Tom Stein
0

Dodatek do odpowiedzi Yu Jiaao. Możesz wywołać polecenie sort-objectcmdlet programu PowerShell w wierszu polecenia, takim jak:

type file.txt | powershell -nop "$input | sort -unique"
snipsnipsnip
źródło