Existe um Windows equivalente ao Unix uniq?

17

Preciso remover linhas duplicadas de um arquivo de texto, é simples no Linux usando

cat file.txt |sort | uniq

quando file.txt contém

aaa
bbb
aaa
ccc

Irá produzir

aaa
bbb
ccc

Existe um equivalente do Windows? ou como fazer isso no Windows?

Yu Jiaao
fonte
10
No Unix, você pode escrever comosort -u file.txt
jfs
1
Há também WSL que funciona muito bem, tanto quanto esse tipo de coisa vai
user2813274
Talvez você queira definir algo como solução, se não tiver mais perguntas?
Davidbaumann

Respostas:

31

O Sort-Objectcmdlet no PowerShell suporta uma -Uniqueopção que faz o mesmo que uniq:

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

Obviamente, devido à presença de aliases no PowerShell, você também pode escrever:

type file.txt | sort -unique

Além disso, há uma /uniqueopção não documentada no sort.exeWindows 10, portanto, isso deve funcionar no prompt de comando:

type file.txt | sort /unique
Yu Jiaao
fonte
1
Eu não acho que o comando do Windows ( sort.exe) suporte isso; parece um recurso do PowerShell embutido.
Ben Voigt
1
digite unsorted.txt | tipo -Unique> sorted.txt Isso realmente trabalho sob win10 e valores exclusivos writed para novo arquivo
Lixas
7
Surpreendentemente @BenVoigt, type file.txt | sort /uniquefunciona com opção de utilidade não documentada (pelo menos no Windows 10). Por outro lado, você está certo de que o exemplo fornecido é o PowerShell , de fato. /uniquesort.exeGet-Content file.txt | Sort-Object -unique
JosefZ
1
sort /uniqueerros Invalid switch.no Windows 7 Enterprise.
Don Cruickshank
1
@ JosefZ, a resposta especifica a opção usando "/" (barra) e não traço; a barra é o padrão do Windows para comandos no CMD, e nem todos os comandos permitem substituir uma barra por uma barra nas opções de comando. docs.microsoft.com/en-us/windows-server/administration/… para uma referência rápida mostra consistentemente barras. A resposta acima foi ótima, compartilhando um petisco pouco conhecido, embora eu não possa imaginar por que a opção "/ unique" não é documentada, pois é muito útil.
Debra
6

Existem portas do uniq que funcionam de maneira idêntica às versões gnu / coreutils. Eu pessoalmente uso a variação do GOW, mas o git para windows tem uma versão significativamente mais nova . Não é necessário cygwin. Para este último, você precisa procurar em / usr / bin

Como esses pacotes também contêm cat, sort e uniq - seu fluxo de trabalho deve ser praticamente idêntico e cat file.txt |sort | uniqdeve funcionar de maneira idêntica

Journeyman Geek
fonte
2

Você pode escrever facilmente o comando "uniq" sozinho. Salve isso em um arquivo em lotes "uniq.cmd" em algum lugar do seu% path% pode encontrá-lo (por exemplo, em% windir% \ system32). Esta versão NÃO diferencia maiúsculas de minúsculas:

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

Isso funciona com "uniq mytextfile" e "cat mytextfile | uniq"; como todas as entradas e argumentos são simplesmente passados ​​para o comando de classificação.

A partir do Windows 7, você pode querer uma versão com distinção entre maiúsculas e minúsculas (a diferença não é a opção não documentada "sort / C" e não "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
)
Tom Stein
fonte
Legal, mas tem algumas falhas. Atualmente, falha com como conteúdo /?, ON, one ^ caretou bang!. Mas isso pode ser resolvido usando a técnica de expansão com atraso de alternância e echo(consulte: Dostips: ECHO. Falha ao fornecer texto ou linha em branco
jeb
Obrigado, o motivo para usar a técnica de expansão com atraso de alternância não era óbvio nem marcado. Editei meus exemplos para ser (quase) perfeito agora.
Tom Stein
0

Além da resposta de Yu Jiaao. Você pode invocar o sort-objectcmdlet do powershell em um prompt de comando como:

type file.txt | powershell -nop "$input | sort -unique"
snipsnipsnip
fonte