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

amprantino
la source
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
Lev Levitsky
la source
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
Kasavbere
la source
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

skywardcode
la source
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!

ashmew2
la source
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.

hychou
la source
7

vous pouvez utiliser:

sort data.txt| uniq -u

cela trie les données et filtre par valeurs uniques

plus noir
la source
4

uniq -u < file fera le travail.

Shiplu Mokaddim
la source
Pas besoin de redirection.
Chris Seymour
Ouais je sais. Fait-il habituellement
Shiplu Mokaddim
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}'


la source
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é

a_rookie_seeking_answers
la source
3

Je trouve cela plus facile.

sort -u input_filename > output_filename

-u signifie unique.

Anant Mittal
la source
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

amprantino
la source