2012-10-13 14 views
5

Załóżmy, że mam dwa pliki tekstowe, z których muszę wyodrębnić dane. Tekst z dwóch plików jest następująca:Jak porównać dwa pliki tekstowe dla tego samego tekstu za pomocą BASH?

Plik 1:

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

Plik 2:

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

Plik 2 Plik 1 Lista nazw domen, pochodzących z adresy e-mail. To nie są te same nazwy domen w jakikolwiek sposób i są całkiem przypadkowe.

Jak mogę uzyskać wyniki nazw domen pasujących do pliku 2 z pliku 1?

Z góry dziękuję!

Odpowiedz

8

Zakładając, że kolejność nie ma znaczenia,

grep -F -f FILE2 FILE1 

powinno załatwić sprawę. (Działa to z powodu mało znanego faktu: opcja -F na grep nie oznacza tylko "dopasowania tego stałego ciągu", to znaczy "dopasuj dowolny z tych ciągów rozdzielonych newliną.")

+0

Jesteś ratunkiem życia. Dziękuję Ci! Czy jest jakiś sposób, aby uzyskać to, aby wyświetlić go w tym samym formacie, takie jak Nazwa - adres e-mail? – user1742682

+0

Zostanie wydrukowane całe linie z pliku FILE1, które zawierają dowolny ciąg w pliku FILE2. Czy nie jest to format, który chcesz? – zwol

+0

Mój błąd! Teraz działa dobrze! Problem z moim formatowaniem. Dziękuję Ci! : D – user1742682

0

Jeśli mam masz rację, chcesz filtrować wszystkie adresy z hostem wymienionym w pliku 2.

Można wtedy po prostu zapętlić File 2 i grep dla @<line>, gromadząc wynik w nowym pliku lub coś podobnego.

Przykład:

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

Prawidłowo! Ale z formatem Name - Email @ ddress używanym w pliku 1. To może wydawać się bezcelowe, ale zdecydowanie ma dla mnie sens! – user1742682

+0

Spowoduje to odczytanie całego pliku1 dla każdej linii w pliku2. Może wykonać zadanie, ale jest bardzo nieefektywne. – jordanm

+0

@jordanm Zgoda. Jestem wszystkim za rozwiązaniem 'grep -f -F'. Próbowałem być konceptualny. – nemo

2

Recepta:

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

będzie wyjście przecięcie wszystkich nazw domen w plik1 i plik2

1

Użyj polecenia VimDIFF, co daje ładną prezentację różnicy

+1

Znalazłem go lepiej niż 'grep -F -f FILE2 FILE1' – Totalys

Powiązane problemy