Мне нужно удалить дубликаты строк из текстового файла, это просто в Linux, используя
cat file.txt |sort | uniq
когда file.txt содержит
aaa
bbb
aaa
ccc
Будет выводить
aaa
bbb
ccc
Есть ли аналог Windows? или как это сделать в Windows?
Мне нужно удалить дубликаты строк из текстового файла, это просто в Linux, используя
cat file.txt |sort | uniq
когда file.txt содержит
aaa
bbb
aaa
ccc
Будет выводить
aaa
bbb
ccc
Есть ли аналог Windows? или как это сделать в Windows?
Ответы:
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
sort.exe
) поддерживает это; это похоже на особенность встроенной оболочки PowerShell.
type file.txt | sort /unique
работает с незарегистрированным переключателем /unique
из sort.exe
утилиты (по крайней мере на Windows 10). С другой стороны, вы правы в том, что приведенный пример представляет собой PowerShell Get-Content file.txt | Sort-Object -unique
.
sort /unique
ошибки с Invalid switch.
Windows 7 Enterprise.
Есть порты 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
)
/?
, ON
, one ^ caret
или bang!
. Но это можно решить, используя переключающую технику отложенного расширения, и echo(
смотрите: Dostips: ECHO. FAILS дать текст или пустую строку
Дополнение к ответу Ю Цзяо. Вы можете вызвать sort-object
командлет powershell из командной строки, например:
type file.txt | powershell -nop "$input | sort -unique"
sort -u file.txt