Чи існує 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, який працює досить добре, що стосується подібних речей
користувач2813274

Можливо, ви хочете встановити щось як рішення, якщо у вас немає додаткових питань?
davidbaumann

Відповіді:


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/… для швидкого посилання послідовно показує косої риски. Вище сказане було чудовою відповіддю, поділившись ласим, не відомим загалом, хоча я не можу уявити, чому перемикач "/ унікальний" недокументований, оскільки це так корисно.
Дебра

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. НЕМАЄТЬСЯ дати текст або порожній рядок
jeb

Дякую, причина використання перемикаючої техніки уповільненого розширення не була очевидною і не поміченою. Я редагував свої приклади, щоб зараз бути (майже) ідеальними.
Том Штейн

0

Доповнення до відповіді Ю. Цзяао Ви можете викликати sort-objectкомандлет powerhell у командному рядку, наприклад:

type file.txt | powershell -nop "$input | sort -unique"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.