web-dev-qa-db-fra.com

Suppression de lignes en double dans un fichier texte .....?

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 lines.

7
user95942

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.

14
user448115

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>
6
Amit

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

Source


Exemple

cat foo

foo
fii
foo bar
foobar
foobar
foo

Perl -ne '$seen{$_}++ or print' foo

foo
fii
foo bar
foobar
2
A.B.