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

17

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

cat file.txt |sort | uniq

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

aaa
bbb
aaa
ccc

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

aaa
bbb
ccc

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

Ю Цзяо
источник
10
В Unix вы можете написать это какsort -u file.txt
jfs
1
Существует также WSL, который работает довольно хорошо, насколько это возможно
user2813274
Может быть, вы хотите установить что-то в качестве решения, если у вас больше нет вопросов?
Давидбауман

Ответы:

31

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

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

Конечно, из-за наличия псевдонимов в PowerShell вы также можете написать:

type file.txt | sort -unique

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

type file.txt | sort /unique
Ю Цзяо
источник
1
Я не думаю, что команда Windows ( sort.exe) поддерживает это; это похоже на особенность встроенной оболочки PowerShell.
Бен Фойгт
1
введите unsorted.txt | sort -unique> sorted.txt Это действительно работает под win10 и записывает уникальные значения в новый файл
Lixas,
7
@BenVoigt удивительно, type file.txt | sort /uniqueработает с незарегистрированным переключателем /uniqueиз sort.exeутилиты (по крайней мере на Windows 10). С другой стороны, вы правы в том, что приведенный пример представляет собой PowerShell Get-Content file.txt | Sort-Object -unique.
JosefZ
1
sort /uniqueошибки с Invalid switch.Windows 7 Enterprise.
Дон Круикшанк,
1
@JosefZ, ответ указывает на переключатель, используя «/» (прямая косая черта), а не тире; прямая косая черта является стандартом Windows для команд в CMD, и не все команды позволяют заменить черту косой чертой на переключателях команд. docs.microsoft.com/en-us/windows-server/administration/… для быстрого ознакомления последовательно показывает косые черты. Вышеприведенный ответ был отличным ответом, он разделяет лакомый кусочек, малоизвестный, хотя я не могу себе представить, почему переключатель «/ unique» недокументирован, поскольку он настолько полезен.
Дебра
6

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

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

Подмастерье Компьютерщик
источник
2

Вы можете легко написать команду "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
)
Том Стейн
источник
Хорошо, но у него есть некоторые недостатки. В настоящее время он терпит неудачу с Содержанием , подобными /?, ON, one ^ caretили bang!. Но это можно решить, используя переключающую технику отложенного расширения, и echo(смотрите: Dostips: ECHO. FAILS дать текст или пустую строку
Джеб
Спасибо, причина использования техники отложенного расширения не была очевидной и не отмечена. Я отредактировал мои примеры, чтобы быть (почти) идеальным сейчас.
Том Стейн
0

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

type file.txt | powershell -nop "$input | sort -unique"
snipsnipsnip
источник