web-dev-qa-db-fra.com

Trouvez 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

J'aimerais que le résultat soit:

2
3

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

67
amprantino

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
70
Lev Levitsky

Utilisez comme suit:

sort < filea | uniq > fileb
17
kasavbere

uniq -u m'a rendu fou parce que ça ne marchait 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, le dernier jeu peut contenir des chaînes '' ou uniquement des espaces. Vous pouvez l'enlever plus tard. Ou tout simplement sortir avec la copie à partir du terminal;)

Just FYI, extrait de la page de manuel uniq:

"Remarque: 'uniq' ne détecte pas les lignes répétées, sauf si elles sont adjacentes. Vous voudrez peut-être d'abord trier les entrées ou utiliser 'sort -u' sans 'uniq'. En outre, les comparaisons respectent les règles spécifiées par 'LC_COLLATE'."

Une des méthodes correctes, à 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!

7
ashmew2

Vous pouvez également imprimer la valeur unique dans "fichier" à l'aide de la commande cat en le connectant à sort et uniq.

cat file | sort | uniq -u

5
skywardcode

uniq -u < file fera le travail.

4
Shiplu Mokaddim

Bien que sort prenne O (n log (n)) temps, je préfère utiliser

awk '!seen[$0]++'

awk '!seen[$0]++' est une abréviation de awk '!seen[$0]++ {print}', ligne d'impression (= 0 $) si seen[$0] n'est pas nul. Cela prend plus d’espace mais seulement O(n)) temps.

3
Vito Chou

uniq devrait bien fonctionner 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
user4401178

vous pouvez utiliser:

sort data.txt| uniq -u

ces données de tri et filtrer par des valeurs uniques

2
blacker
sort -d "file name" | uniq -u

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

C'était la première fois que j'essayais

skilla:~# uniq -u all.sorted  

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

Après avoir fait un chat -e tous.sorties

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

0
amprantino