Trouvez des lignes uniques


90

Comment puis-je 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

J'aimerais que le résultat soit:

2
3

sort file | uniqne fera pas le travail. Affiche toutes les valeurs 1 fois


17
Le fichier doit être trié en premier. sort file | uniq -usortira vers la console pour vous.
ma77c

Je pense que la raison sort file | uniqmontre toutes les valeurs une fois, c'est parce qu'il imprime immédiatement la ligne qu'il rencontre la première fois, et pour les rencontres suivantes, il les ignore simplement.
Reeshabh Ranjan

Réponses:


88

uniq a l'option dont vous avez besoin:

   -u, --unique
          only print unique lines
$ cat file.txt
1
1
2
3
5
5
7
7
$ uniq -u file.txt
2
3

32
Assurez-vous de trier si les entrées du fichier ou pas déjà triées. trier le fichier.txt | uniq
user3885927

voyez ma réponse si vous ne voulez pas faire le tri en premier. stackoverflow.com/a/54803217/5441945
hychou

28

Utilisez comme suit:

sort < filea | uniq > fileb

2
Ce n'est pas correct, je pense que vous vouliez dire:uniq -u filea > fileb
Chris Seymour

1
Copier vos données et l' exécuter et il fonctionne: sort<filea.txt | uniq>fileb.txt. Vous avez peut-être oublié les extensions. J'utilise un Mac OS X. vous devez passer d' filea.txtun autre à un autrefileb.txt
kasavbere

Il n'y a pas besoin de redirection avec sortet à quoi sert le piping uniqlorsque vous pouvez simplement faire sort -u file -o filece que vous faites est de supprimer les valeurs en double, c'est-à-dire que votre filebcontient 1,2,3,5,7l'OP ne veut que les lignes uniques qui sont 2,3et sont réalisées par l' uniq -u fileextension de fichier n'a rien avec lui, votre réponse est fausse.
Chris Seymour

12

Vous pouvez également imprimer la valeur unique dans "fichier" à l'aide de la catcommande en redirigeant vers sortetuniq

cat file | sort | uniq -u


9

uniq -u m'a rendu fou parce que cela ne fonctionnait pas.

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

En supposant que vous ayez 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 de lignes vides, l'ensemble final peut contenir des chaînes «» ou uniquement des espaces. Vous pouvez le supprimer plus tard. Ou évitez tout simplement de copier depuis le terminal;)

#

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

"Remarque: 'uniq' ne détecte pas les lignes répétées sauf si elles sont adjacentes. Vous pouvez d'abord trier l'entrée, ou utiliser 'sort -u' sans 'uniq'. De plus, les comparaisons respectent les règles spécifiées par 'LC_COLLATE'."

Une des méthodes correctes pour appeler 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êt!


3
C'est exagéré.
SmallChess

9

Alors que sortprend O (n log (n)) temps, je préfère utiliser

awk '!seen[$0]++'

awk '!seen[$0]++'est une abréviation pour awk '!seen[$0]++ {print}', print line (= $ 0) si seen[$0]n'est pas zéro. Cela prend plus de place mais seulement O (n) temps.


7

vous pouvez utiliser:

sort data.txt| uniq -u

cela trie les données et filtre par valeurs uniques



3

uniqdevrait bien faire 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}'


3
sort -d "file name" | uniq -u

cela a fonctionné pour moi pour un similaire. Utilisez ceci s'il n'est pas arrangé. Vous pouvez supprimer le tri s'il est organisé


3

Je trouve cela plus facile.

sort -u input_filename > output_filename

-u signifie unique.


0

C'était la première que j'ai essayé

skilla:~# uniq -u all.sorted  

76679787
76679787 
76794979
76794979 
76869286
76869286 
......

Après avoir fait un chat -e tout.

skilla:~# cat -e all.sorted 
$
76679787$
76679787 $
76701427$
76701427$
76794979$
76794979 $
76869286$
76869286 $

Chaque deuxième ligne a un espace de fin: (Après avoir supprimé tous les espaces de fin, cela a fonctionné!

Merci

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.