203 votes

Supprimer les entrées en double dans un script Bash

Je souhaite supprimer les entrées en double d'un fichier texte, par exemple :

 kavitha= Tue Feb    20 14:00 19 IST 2012  (duplicate entry) 
sree=Tue Jan  20 14:05 19 IST 2012  
divya = Tue Jan  20 14:20 19 IST 2012  
anusha=Tue Jan 20 14:45 19 IST 2012 
kavitha= Tue Feb    20 14:00 19 IST 2012 (duplicate entry) 

Existe-t-il un moyen de supprimer les entrées en double à l'aide d'un script Bash ?

Sortie désirée

 kavitha= Tue Feb    20 14:00 19 IST 2012 
sree=Tue Jan  20 14:05 19 IST 2012  
divya = Tue Jan  20 14:20 19 IST 2012  
anusha=Tue Jan 20 14:45 19 IST 2012

464voto

kev Points 41855

Vous pouvez sort puis uniq :

 $ sort -u input.txt

Ou utilisez awk :

 $ awk '!a[$0]++' input.txt

19voto

Siva Charan Points 10518

Il supprime les lignes consécutives en double d'un fichier (émule "uniq"). La première ligne d'un ensemble de lignes en double est conservée, les autres sont supprimées.

 sed '$!N; /^\(.*\)\n\1$/!P; D'

12voto

Chris Koknat Points 1732

Une ligne Perl similaire à la solution awk de @kev :

 perl -ne 'print if ! $a{$_}++' input

Cette variante supprime les espaces de fin avant de comparer :

 perl -lne 's/\s*$//; print if ! $a{$_}++' input

Cette variante modifie le fichier sur place :

 perl -i -ne 'print if ! $a{$_}++' input

Cette variante modifie le fichier sur place et effectue une sauvegarde input.bak

 perl -i.bak -ne 'print if ! $a{$_}++' input

0voto

potong Points 18653

Cela pourrait fonctionner pour vous:

 cat -n file.txt |
sort -u -k2,7 |
sort -n |
sed 's/.*\t/    /;s/\([0-9]\{4\}\).*/\1/'

ou ca:

  awk '{line=substr($0,1,match($0,/[0-9][0-9][0-9][0-9]/)+3);sub(/^/,"    ",line);if(!dup[line]++)print line}' file.txt

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X