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?
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
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.
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
)