web-dev-qa-db-fra.com

Existe-t-il un équivalent Windows à l’uniq Unix?

J'ai besoin de supprimer les lignes en double d'un fichier texte, c'est simple sous Linux

cat file.txt |sort | uniq

quand fichier.txt contient

aaa
bbb
aaa
ccc

Il va sortir

aaa
bbb
ccc

Existe-t-il un équivalent Windows? ou comment faire cela de manière Windows?

15
Yu Jiaao

La cmdlet Sort-Object dans PowerShell prend en charge un commutateur -Unique qui fait la même chose que uniq:

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

Bien sûr, en raison de la présence d’alias dans PowerShell, vous pouvez également écrire:

type file.txt | sort -unique

De plus, il existe un commutateur /unique non documenté dans sort.exe de Windows 10; il devrait donc fonctionner dans l'invite de commande:

type file.txt | sort /unique
26
Yu Jiaao

Il existe des ports d’uniq qui fonctionnent de la même manière que les versions gnu/coreutils. Personnellement, j’utilise la variante de GOW , mais git pour Windows a une version sensiblement plus récente . Pas besoin de cygwin, mais pour ce dernier, vous devez regarder dans/usr/bin

Etant donné que ces paquets contiennent également cat, sort et uniq, votre flux de travail doit être essentiellement identique et cat file.txt |sort | uniq doit fonctionner à l'identique.

6
Journeyman Geek

Vous pouvez facilement écrire la commande "uniq" vous-même. Enregistrez-le dans un fichier de commandes "uniq.cmd" quelque part dans votre% chemin% peut le trouver (par exemple, dans% windir%\system32). Cette version n'est pas sensible à la casse:

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

Cela fonctionne avec "uniq mytextfile" ainsi que "cat mytextfile | uniq"; comme toutes les entrées et les arguments sont simplement passés à la commande de tri.

À partir de Windows 7, vous souhaiterez peut-être une version sensible à la casse (la différence est un commutateur non documenté "sort/C" et non "si/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
)
1
Tom Stein