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.