Есть ли Windows, эквивалентный Unix Uniq?

Мне нужно удалить дубликаты строк из текстового файла, это просто в Linux, используя

cat file.txt |sort | uniq

когда file.txt содержит

aaa
bbb
aaa
ccc

Будет выводить

aaa
bbb
ccc

Есть ли аналог Windows? или как это сделать в Windows?

3 ответа

Sort-Object Командлет в PowerShell поддерживает -Unique переключатель, который делает то же самое, что и uniq:

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

Конечно, благодаря наличию псевдонимов в PowerShell вы также можете написать:

type file.txt | sort -unique

Кроме того, есть недокументированный /unique включить sort.exe Windows 10, так что это должно работать в командной строке:

type file.txt | sort /unique

Есть порты uniq, которые работают идентично версиям gnu/coreutils. Я лично использую вариант от GOW, но git для Windows имеет значительно более новую версию. Cygwin не требуется, хотя для последнего вам нужно искать в /usr/bin

Поскольку эти пакеты также содержат cat, sort и uniq - ваш рабочий процесс должен быть в основном идентичным, и cat file.txt |sort | uniq должен работать в основном одинаково

Вы можете легко написать команду "uniq" самостоятельно. Сохраните это в командном файле "uniq.cmd" где-нибудь в вашем%path%, где вы можете его найти (например, в%windir%\system32). Эта версия НЕ чувствительна к регистру:

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

Это работает с "uniq mytextfile", а также "cat mytextfile | uniq"; все входные данные и аргументы просто передаются команде сортировки.

Начиная с Windows 7, вам может понадобиться действительно чувствительная к регистру версия (разница заключается в недокументированном переключателе "sort /C" и "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
)

Дополнение к ответу Ю Цзяо. Вы можете вызвать sort-object Командлет powershell в командной строке, например:

type file.txt | powershell -nop "$input | sort -unique"
Другие вопросы по тегам