122 votes

Trouver des lignes uniques

Comment trouver les lignes uniques et supprimer tous les doublons d'un fichier ? Mon fichier d'entrée est

1
1
2
3
5
5
7
7

Je voudrais que le résultat soit :

2
3

sort file | uniq ne fera pas l'affaire. Afficher toutes les valeurs une seule fois

12voto

Anant Mittal Points 1133

Je trouve cela plus facile.

sort -u input_filename > output_filename

-u signifie "unique".

11voto

ashmew2 Points 177

Uniq -u m'a rendu fou parce qu'il ne fonctionnait pas.

Donc, au lieu de cela, si vous avez python (la plupart des distros et serveurs Linux l'ont déjà) :

En supposant que vous avez le fichier de données dans notUnique.txt

#Python
#Assuming file has data on different lines
#Otherwise fix split() accordingly.

uniqueData = []
fileData = open('notUnique.txt').read().split('\n')

for i in fileData:
  if i.strip()!='':
    uniqueData.append(i)

print uniqueData

###Another option (less keystrokes):
set(open('notUnique.txt').read().split('\n'))

Notez qu'en raison des lignes vides, l'ensemble final peut contenir des chaînes '' ou des chaînes à espace unique. Vous pouvez supprimer cela plus tard. Ou simplement copier à partir du terminal ;)

#

Juste pour info, à partir de la page de manuel de uniq :

"Note : 'uniq' ne détecte pas les lignes répétées à moins qu'elles ne soient adjacentes. Vous pouvez vouloir trier l'entrée en premier, ou utiliser 'sort -u' sans 'uniq'. De plus, les comparaisons respectent les règles spécifiées par 'LC_COLLATE'."

Une des façons correctes, d'invoquer avec : # sort nonUnique.txt | uniq

Exemple d'exécution :

$ cat x
3
1
2
2
2
3
1
3

$ uniq x
3
1
2
3
1
3

$ uniq -u x
3
1
3
1
3

$ sort x | uniq
1
2
3

Les espaces peuvent être imprimés, alors soyez prêts !

5voto

shiplu.mokadd.im Points 28895

uniq -u < file fera l'affaire.

3voto

uniq devrait faire l'affaire si votre fichier est/peut être trié, si vous ne pouvez pas trier le fichier pour une raison quelconque, vous pouvez utiliser awk :

awk '{a[$0]++}END{for(i in a)if(a[i]<2)print i}'

3voto

sort -d "file name" | uniq -u

cela a marché pour moi pour un cas similaire. Utilisez ceci si ce n'est pas prévu. Vous pouvez enlever le tri si c'est arrangé

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