2010-05-14 7 views
10

Wie bekomme ich die folgende Ausgabe mithilfe von Linux-Befehl durch den Vergleich von zwei Textdateien? Vielen Dank.Vergleichen Sie zwei Dateien und erhalten Sie die Ausgabe für die gleichen Zeilen

file1:

site110 
site120 

file2 (Aktualisiert):

domain1.com - site110 
domain2.com - site111 
domain3.com - site112 
domain4.com - site113 
domain5.com - site120 
domain6.com - site1201 
domain7.com - site1202 

Ausgang:

domain1.com - site110 
domain5.com - site120 

Wenn ich benutze:

grep -f file1 file2 

der Ausgang sein:

domain1.com - site110 
domain5.com - site120 
domain6.com - site1201 
domain7.com - site1202 

, die die letzten beiden Zeilen sind nicht das, was ich will. Vielen Dank.

+0

Es ist nicht notwendig, "[SOLVED]" hinzuzufügen, das System hat seine eigenen Indikatoren. –

+0

Danke. Ich liebe SO-System. :) – garconcn

+0

Ich kann 'grep -f' auch hier nicht machen, aber wenn ich' -w' zum 'grep' Befehl hinzufüge, funktioniert es. – Thor

Antwort

13

Vom grep manpage:

-f FILE, --file=FILE 
      Obtain patterns from FILE, one per line. The empty file 
      contains zero patterns, and therefore matches nothing. (-f is 
      specified by POSIX.) 

Deshalb:

grep -f file1 file2 

domain1.com - site110 
domain5.com - site120 
+0

Ich habe grep -f file1 file2 vorher versucht, aber es hat nicht mit meinem Skript funktioniert. Ich dachte, es geht nicht. Jetzt habe ich mein Skript korrigiert. Vielen Dank. – garconcn

+0

Dies entspricht "site1201" hier, aber wenn ich '-w' zum' grep' Befehl hinzufüge, funktioniert es. – Thor

0

Wie wäre es mit diff?

+0

Zuerst dachte ich, diff könnte mein Problem lösen, aber ich weiß nicht, welche Option zu verwenden ist. Vielen Dank. – garconcn

0

man paste sein kann? Einige Ausgabeverarbeitung kann benötigt werden.

3

Verwenden Sie comm Befehl.

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

Dieser Befehl ist genauer als grep -f.

+0

Liebe das, danke! Funktioniert auch gut für Verzeichnisse: comm -12 <(ls -1 dir1/| sort) <(ls -1 dir2/| sort) – Nitro

1

Ich denke, Sie suchen nach einer Art Datenbank-Join-Funktion. Unix hat einen Befehl dafür: join. In Ihrem Fall:

join -1 1 -2 3 -t " " -o 2.1,2.2,2.3 file1 file2 
Verwandte Themen