2012-10-13 4 views
5

Angenommen, ich habe zwei Textdateien, aus denen ich Daten extrahieren muss. Der Text der beiden Dateien ist wie folgt:Wie zwei Textdateien für den gleichen genauen Text mit BASH vergleichen?

Datei 1:

1name - [email protected] 
2Name - [email protected] 
3Name - [email protected] 
4Name - [email protected] 

File 2:

email.com 
email.com 
email.com 
anotherwebsite.com 

Datei 2 wird die Liste der Datei 1 von Domain-Namen, extrahiert aus die E-Mail-Adressen. Dies sind keineswegs die gleichen Domain-Namen und sind ziemlich zufällig.

Wie kann ich die Ergebnisse der Domänennamen erhalten, die Datei 2 aus Datei 1 entsprechen?

Vielen Dank im Voraus!

Antwort

8

diese Ordnung Unter der Annahme spielt keine Rolle,

grep -F -f FILE2 FILE1 

sollte es tun. (Dies funktioniert aufgrund eines wenig bekannte Tatsache: die -F Option grep bedeutet nicht nur „diese feste Zeichenfolge übereinstimmen,“ es bedeutet „jeder dieser Newline getrennte entsprechen festen Strings“).

+0

Sie sind ein Lebensretter. Vielen Dank! Gibt es eine Möglichkeit, dies im gleichen Format wie Name - E-Mail-Adresse wiederzugeben? – user1742682

+0

Es werden ganze Zeilen aus FILE1 gedruckt, die eine der Zeichenfolgen in FILE2 enthalten. Ist das nicht das gewünschte Format? – zwol

+0

Mein Fehler! Es funktioniert jetzt gut! Problem mit meiner Formatierung. Vielen Dank! : D – user1742682

0

Wenn ich bekam Sie wollen nach allen Adressen mit dem in Datei 2 genannten Host filtern.

Sie könnten dann einfach über File 2 und grep für @<line>, das Ergebnis in einer neuen Datei oder etwas ähnliches sammeln.

Beispiel:

cat file2 | sort -u | while read host; do grep "@$host" file1; done > filtered 
+0

Richtig! Aber mit dem Namen - E-Mail @ Adresse Format in Datei 1 verwendet. Es mag sinnlos erscheinen, aber es hat definitiv einen Punkt für mich! – user1742682

+0

Dies liest alle Datei1 für jede Zeile in Datei2. Es kann die Arbeit erledigen, aber es ist sehr ineffizient. – jordanm

+0

@jordanm Einverstanden. Ich bin alles für die 'grep -f-F'-Lösung. Ich habe versucht, konzeptuell zu sein. – nemo

2

Das Rezept:

join <(sed 's/^.*@//' file1|sort -u) <(sort -u file2) 

wird es Ausgabe der Durchschnitt aller Domain-Namen in file1 und file2

1

Verwenden Sie VimDIFF-Befehl, dies gibt eine schöne Präsentation des Unterschieds

+1

Ich fand es besser als 'grep -F -f FILE2 FILE1' – Totalys

Verwandte Themen