Esiste un Windows equivalente a Unix Uniq?


17

Ho bisogno di rimuovere le righe duplicate da un file di testo, è semplice usando Linux

cat file.txt |sort | uniq

quando file.txt contiene

aaa
bbb
aaa
ccc

Verrà emesso

aaa
bbb
ccc

Esiste un equivalente di Windows? o come si fa in Windows?


10
Su Unix, potresti scriverlo comesort -u file.txt
jfs il

1
C'è anche WSL che funziona abbastanza bene per quanto riguarda questo genere di cose
user2813274

Forse vuoi impostare qualcosa come soluzione, se non hai ulteriori domande?
davidbaumann,

Risposte:


31

Il Sort-Objectcmdlet in PowerShell supporta uno -Uniqueswitch che fa la stessa cosa di uniq:

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

Naturalmente, a causa della presenza di alias in PowerShell, puoi anche scrivere:

type file.txt | sort -unique

Inoltre, c'è un'opzione non documentata /uniquein sort.exeWindows 10, quindi dovrebbe funzionare nel prompt dei comandi:

type file.txt | sort /unique

1
Non credo che il comando Windows ( sort.exe) supporti questo; sembra una funzionalità del built-in PowerShell.
Ben Voigt,

1
digitare unsorted.txt | sort -unique> sort.txt Funziona davvero con win10 e ha scritto valori univoci in un nuovo file
Lixas

7
@BenVoigt sorprendentemente, type file.txt | sort /uniquefunziona con switch di utilità non documentato (almeno su Windows 10). D'altra parte, hai ragione che l'esempio fornito è PowerShell , in effetti. /uniquesort.exeGet-Content file.txt | Sort-Object -unique
JosefZ,

1
sort /uniqueerrori con Invalid switch.su Windows 7 Enterprise.
Don Cruickshank,

1
@JosefZ, la risposta specifica lo switch usando "/" (barra) e non trattino; la barra rovesciata è lo standard di Windows per i comandi in CMD e non tutti i comandi consentono di sostituire un trattino con una barra sulle opzioni di comando. docs.microsoft.com/en-us/windows-server/administration/… per una rapida consultazione mostra costantemente le barre. Quanto sopra è stata un'ottima risposta, condividendo un bocconcino non comunemente noto, anche se non riesco a immaginare perché l'opzione "/ unique" non sia documentata poiché è così utile.
Debra,

6

Ci sono porte di uniq che funzionano in modo identico alle versioni gnu / coreutils. Personalmente uso la variante di GOW ma git per Windows ha una versione significativamente più recente . Nessun cygwin richiesto anche se per quest'ultimo è necessario cercare in / usr / bin

Poiché questi pacchetti contengono anche cat, sort e uniq, il flusso di lavoro dovrebbe essere per lo più identico e cat file.txt |sort | uniqdovrebbe funzionare principalmente in modo identico


2

Puoi facilmente scrivere il comando "uniq" da solo. Salvalo in un file batch "uniq.cmd" da qualche parte nel tuo% path% lo trova (es. In% windir% \ system32). Questa versione NON fa distinzione tra maiuscole e minuscole:

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

Funziona con "uniq mytextfile" e "cat mytextfile | uniq"; poiché tutti gli input e gli argomenti vengono semplicemente passati al comando sort.

A partire da Windows 7, potresti volere una versione con distinzione tra maiuscole e minuscole (la differenza è l'opzione "document / C" non documentata e nessun "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
)

Bello, ma ha alcuni difetti. Attualmente non riesce con il simile tenore /?, ON, one ^ careto bang!. Ma questo può essere risolto utilizzando la tecnica di espansione ritardata di commutazione e echo(vedere: Dostips: ECHO. NON FA dare testo o una riga vuota
jeb

Grazie, la ragione per usare la tecnica di espansione ritardata di attivazione / disattivazione non era stata ovvia né contrassegnata. Ho modificato i miei esempi per essere (quasi) perfetto ora.
Tom Stein,

0

Aggiunta alla risposta di Yu Jiaao. È possibile richiamare il sort-objectcmdlet PowerShell in un prompt dei comandi come:

type file.txt | powershell -nop "$input | sort -unique"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.