Мені потрібно видалити повторювані рядки з текстового файлу, в 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. НЕМАЄТЬСЯ дати текст або порожній рядок
sort -u file.txt