Finden Sie eindeutige Linien

85

Wie kann ich die eindeutigen Zeilen finden und alle Duplikate aus einer Datei entfernen? Meine Eingabedatei ist

1
1
2
3
5
5
7
7

Ich möchte, dass das Ergebnis lautet:

2
3

sort file | uniqwird den Job nicht machen. Zeigt alle Werte 1 Mal an

Amprantino
quelle
17
Die Datei muss zuerst sortiert werden. sort file | uniq -uwird für Sie auf die Konsole ausgegeben.
ma77c
Ich denke, der Grund sort file | uniq, warum alle Werte 1 Mal angezeigt werden, ist, dass die Zeile, auf die sie beim ersten Mal trifft, sofort gedruckt wird und bei den nachfolgenden Begegnungen einfach übersprungen wird.
Reeshabh Ranjan

Antworten:

86

uniq hat die Option, die Sie benötigen:

   -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
quelle
30
Stellen Sie sicher, dass Sie sortieren, wenn die Einträge in der Datei oder nicht bereits sortiert sind. sort file.txt | uniq
user3885927
siehe meine Antwort, wenn Sie nicht zuerst sortieren möchten. stackoverflow.com/a/54803217/5441945
Hychou
27

Verwenden Sie wie folgt:

sort < filea | uniq > fileb
kasavbere
quelle
2
Das ist nicht richtig, ich denke du meintest:uniq -u filea > fileb
Chris Seymour
1
Ich kopiere Ihre Daten und führe sie aus und es funktioniert : sort<filea.txt | uniq>fileb.txt. Vielleicht haben Sie die Erweiterungen weggelassen. Ich benutze ein Mac OS X. Sie müssen zu einem filea.txtanderen fileb.txt
wechseln
Es ist keine Umleitung mit erforderlich, sortund der Punkt, an den Sie weiterleiten können, uniqwenn Sie nur das tun können, sort -u file -o filewas Sie tun, ist das Entfernen der doppelten Werte, dh Ihr OP filebenthält 1,2,3,5,7nur die eindeutigen Zeilen, die 2,3durch die uniq -u fileDateierweiterung erreicht werden und erreicht werden Ihre Antwort ist falsch.
Chris Seymour
9

uniq -u hat mich verrückt gemacht, weil es nicht funktioniert hat.

Also stattdessen, wenn Sie Python haben (die meisten Linux-Distributionen und Server haben es bereits):

Angenommen, Sie haben die Datendatei in 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'))

Beachten Sie, dass der endgültige Satz aufgrund leerer Zeilen möglicherweise Zeichenfolgen mit '' oder nur Leerzeichen enthält. Sie können das später entfernen. Oder einfach mit dem Kopieren vom Terminal wegkommen;)

#

Nur zu Ihrer Information: Von der Uniq-Manpage:

"Hinweis: 'uniq' erkennt wiederholte Zeilen nur, wenn sie benachbart sind. Möglicherweise möchten Sie zuerst die Eingabe sortieren oder 'sort -u' ohne 'uniq' verwenden. Außerdem werden bei Vergleichen die in 'LC_COLLATE' angegebenen Regeln berücksichtigt."

Eine der richtigen Möglichkeiten zum Aufrufen mit: # sort nonUnique.txt | uniq

Beispiellauf:

$ 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

Leerzeichen können gedruckt werden, seien Sie also vorbereitet!

ashmew2
quelle
3
Das ist übertrieben.
HelloWorld
9

Sie können den eindeutigen Wert in "Datei" auch mit dem catBefehl ausdrucken, indem Sie an sortund weiterleitenuniq

cat file | sort | uniq -u

Skywardcode
quelle
8

Während sortO (n log (n)) Zeit benötigt, bevorzuge ich die Verwendung

awk '!seen[$0]++'

awk '!seen[$0]++'ist eine Abkürzung für awk '!seen[$0]++ {print}'print line (= $ 0), wenn seen[$0]nicht Null ist. Es braucht mehr Platz, aber nur O (n) Zeit.

Hychou
quelle
6

Sie können verwenden:

sort data.txt| uniq -u

Diese sortieren Daten und filtern nach eindeutigen Werten

schwärzer
quelle
4

uniq -u < file wird den Job machen.

Shiplu Mokaddim
quelle
Die Umleitung ist nicht erforderlich.
Chris Seymour
Ja ich weiß.
Hab
3

uniqsollte gut tun, wenn Ihre Datei sortiert ist / sein kann, wenn Sie die Datei aus irgendeinem Grund nicht sortieren können, können Sie verwenden awk:

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


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

das hat bei mir für einen ähnlichen funktioniert. Verwenden Sie dies, wenn es nicht angeordnet ist. Sie können die Sortierung entfernen, wenn sie angeordnet ist

a_rookie_seeking_answers
quelle
0

Dies war das erste Mal, dass ich es versuchte

skilla:~# uniq -u all.sorted  

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

Nach einer Katze -e all.sorted

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

Jede zweite Zeile hat ein Leerzeichen :( Nach dem Entfernen aller Leerzeichen hat es funktioniert!

Danke

Amprantino
quelle
0

Ich finde das einfacher.

sort -u input_filename > output_filename

-u steht für einzigartig.

Anant Mittal
quelle