2012-06-19 4 views
23

Ich habe 2 Dateien mit einer Liste von Zahlen (Telefonnummern)Vergleich 2 unsortierten Listen in Linux, die einzigartig in der zweiten Datei Listing

Ich bin für eine Methode suchen, um die Zahlen in der zweiten Datei auflistet, die nicht in der ersten Datei

ich die verschiedenen Methoden versucht haben, mit:

comm (getting some weird sorting errors) 
fgrep -v -x -f second-file.txt first-file.txt (unsure of the result, there should be more) 

Dank

+0

Haben Sie diese Antwort geprüft: http://stackoverflow.com/a/1617326/15165? BTW: bevor Sie etwas tun, stellen Sie sicher, dass Sie alle nachgestellten Zeilen und zusätzliche Leerzeichen entfernt haben. Dies könnte der Grund sein, warum Sie nicht alle gefunden haben ... – bcelary

Antwort

47
grep -Fxv -f first-file.txt second-file.txt 

sieht grundsätzlich für alle Linien in second-file.txt, die in first-file.txt keine Linie entsprechen. Kann langsam sein, wenn die Dateien groß sind.

Auch wenn Sie die Dateien sortieren (sort -n verwenden, wenn sie numerisch sind), sollte comm auch funktioniert haben. Welchen Fehler gibt es? Versuchen Sie folgendes:

comm -23 second-file-sorted.txt first-file-sorted.txt 
+0

Scheint, den Trick zu tun, dauerte nur ein paar Sekunden, mit etwa 500000 Zeilen in den beiden Dateien kombiniert – mvrasmussen

+0

Cool, 500k sollte gut sein auf modernen Maschinen. Aber ich hätte mir nicht vorgestellt, dass es so schnell wäre. Hat das Komm Ding funktioniert? –

+1

Warnung, Sie können nicht Sort -n mit Komm verwenden, siehe meine Test –

17

benötigen Sie comm verwenden:

comm -13 first.txt second.txt 

wird den Job erledigen.

ps. Reihenfolge der ersten und zweiten Datei in Befehlszeilenangelegenheiten.

auch müssen Sie Dateien sortieren, bevor:

comm -13 <(sort first.txt) <(sort second.txt) 

bei Dateien sind -n Option sort numerische hinzuzufügen.

+0

Das Ergebnis: comm: Datei 2 ist nicht in sortierter Reihenfolge comm: Datei 1 ist nicht in sortierter Reihenfolge Und eine Liste mit genau der gleichen Anzahl von Zeilen als file2 – mvrasmussen

+0

so können Sie versuchen, sie vorher zu sortieren. Ich habe gerade eine Variante mit 'comm' +' sort' hinzugefügt. – rush

+1

Beachten Sie, dass das numerische Sortieren der Dateien möglicherweise nicht funktioniert, da comm erwartet, dass sie lexikografisch sortiert werden. – chepner

6

Diese

comm -13 <(sort file1) <(sort file2) 

funktionieren sollte Es scheint sort -n (numeric) kann nicht mit comm arbeiten, die Art verwendet (alphanumerische) intern

f1.txt

1 
2 
21 
50 

f2.txt

1 
3 
21 
50 

21 sollte in dritte Spalte erscheinen

#WRONG 
$ comm <(sort -n f1.txt) <(sort -n f2.txt) 
       1 
2 
21 
     3 
     21 
       50 

#OK 
$ comm <(sort f1.txt) <(sort f2.txt) 
       1 
2 
       21 
     3 
       50 
2
cat f1.txt f2.txt | sort |uniq > file3 
+0

Leider bietet dies die eindeutige Liste aller Zeilen in beiden Dateien, und der Anforderer sucht nur andere Zeilen aus Datei 2. – ingyhere

Verwandte Themen