137 votes

Supprimer les lignes en double sans trier

J'ai un utilitaire script en Python :

#!/usr/bin/env python
import sys
unique_lines = []
duplicate_lines = []
for line in sys.stdin:
  if line in unique_lines:
    duplicate_lines.append(line)
  else:
    unique_lines.append(line)
    sys.stdout.write(line)
# optionally do something with duplicate_lines

Cette simple fonctionnalité ( uniq sans avoir besoin de trier d'abord, ordre stable) doit être disponible comme un simple utilitaire UNIX, n'est-ce pas ? Peut-être une combinaison de filtres dans un tuyau ?

Motif de la demande : j'ai besoin de cette fonctionnalité sur un système sur lequel je ne peux pas exécuter Python depuis n'importe où.

2voto

hwertz Points 21

Merci 1_CR ! J'avais besoin d'un "uniq -u" (supprimer entièrement les doublons) plutôt que d'uniq (laisser 1 copie des doublons). Les solutions awk et perl ne peuvent pas vraiment être modifiées pour faire cela, la vôtre oui ! J'ai peut-être aussi eu besoin d'une utilisation plus faible de la mémoire puisque je vais uniq'ing comme 100.000.000 lignes 8-). Juste au cas où quelqu'un d'autre en aurait besoin, j'ai juste mis un "-u" dans la partie uniq de la commande :

awk '{print(NR"\t"$0)}' file_name | sort -t$'\t' -k2,2 | uniq -u --skip-fields 1 | sort -k1,1 -t$'\t' | cut -f2 -d$'\t'

-1voto

speedolli Points 1

Je voulais juste supprimer tous les doublons sur les lignes suivantes, pas partout dans le fichier. J'ai donc utilisé :

awk '{
  if ($0 != PREVLINE) print $0;
  PREVLINE=$0;
}'

-1voto

Master James Points 547

Le site uniq fonctionne dans un alias même http://man7.org/linux/man-pages/man1/uniq.1.html

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