Comment puis-je supprimer les lignes en double dans un fichier texte via une invite de commande?
Par exemple: j'ai un fichier texte de 10 Mo et je veux ne garder qu'une seule ligne de My line
, mais quelque part dans le fichier texte, il y a 2 My line
s.
Utiliser awk
awk '!x[$0]++' infile.txt > outfile.txt
la façon dont cela fonctionne est de garder le nombre de lignes dans un tableau, et si le nombre actuel est égal à zéro, c'est-à-dire la première fois, il affiche la ligne, sinon il continue jusqu'à la suivante.
Il y a plusieurs façons de le faire. Si la commande n’est pas importante, triez et uniq est plus facile à retenir. Cependant, si vous souhaitez conserver l'ordre du fichier texte tout en supprimant les doublons, awk fait l'affaire. Vous pouvez également utiliser sed je crois.
Voici un exemple
/tmp/debugSys>cat fileWithDupText.txt
line2
line21
line2
line1
line2
/tmp/debugSys>
/tmp/debugSys>cat fileWithDupText.txt | awk '!a[$0]++'
line2
line21
line1
/tmp/debugSys>sort fileWithDupText.txt | uniq
line1
line2
line21
/tmp/debugSys>sort -u fileWithDupText.txt
line1
line2
line21
/tmp/debugSys>
J'ai trouvé un Nice-Perl Nice en utilisant des hachages md5 ;) , mais c'est lent et ne vaut que si vous avez de très longues lignes et un fichier énorme où il réduira considérablement l'utilisation de la mémoire:
Perl -MDigest::MD5 -ne '$seen{Digest::MD5::md5($_)}++ or print' foo
Donc simplement utiliser
Perl -ne '$seen{$_}++ or print' foo
Exemple
cat foo
foo
fii
foo bar
foobar
foobar
foo
Perl -ne '$seen{$_}++ or print' foo
foo
fii
foo bar
foobar