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


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

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

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!


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


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.


6

Sie können verwenden:

sort data.txt| uniq -u

Diese sortieren Daten und filtern nach eindeutigen Werten



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}'


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


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


0

Ich finde das einfacher.

sort -u input_filename > output_filename

-u steht für einzigartig.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.