2012-10-13 10 views
5

Diciamo che ho due file di testo di cui ho bisogno per estrarre i dati da. Il testo dei due file è il seguente:Come confrontare due file di testo per lo stesso testo esatto usando BASH?

File 1:

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

File 2:

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

File 2 è File 1 di lista di nomi di dominio, estratto da gli indirizzi email Questi non sono gli stessi nomi di dominio con qualsiasi mezzo e sono piuttosto casuali.

Come posso ottenere i risultati dei nomi di dominio che corrispondono a File 2 dal File 1?

Grazie in anticipo!

risposta

8

Supponendo che l'ordine non importa,

grep -F -f FILE2 FILE1 

dovrebbe fare il trucco. (Questo funziona a causa di un fatto poco noto: l'opzione -F-grep non significa solo "corrisponde a questa stringa fisso", significa "corrisponde a nessuna di queste stringhe fisse di nuova riga separati.")

+0

Sei un salvavita. Grazie! C'è un modo in cui possiamo ottenere questo per visualizzarlo nello stesso formato come Nome - Indirizzo e-mail? – user1742682

+0

Stampa le intere righe da FILE1 che contengono le stringhe in FILE2. Non è questo il formato che desideri? – zwol

+0

Il mio errore! Funziona bene ora! Problema con la mia formattazione. Grazie! : D – user1742682

0

Se ho ottenuto hai ragione, vuoi filtrare per tutti gli indirizzi con l'host menzionato nel File 2.

Potresti quindi eseguire il loop su e grep per @<line>, accumulando il risultato in un nuovo file o qualcosa di simile.

Esempio:

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

corretto! Ma con il nome - Formato email @ ddress utilizzato nel File 1. Può sembrare inutile, ma sicuramente ha un punto per me! – user1742682

+0

Questo leggerà tutto il file1 per ogni riga nel file2. Potrebbe portare a termine il lavoro, ma è molto inefficiente. – jordanm

+0

@jordanm Concordato. Sono tutto per la soluzione 'grep -f -F'. Ho cercato di essere concettuale. – nemo

2

La ricetta:

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

sarà uscita l'intersezione di tutti i nomi di dominio in file1 e file2

1

Vedere BashFAQ/036 per l'elenco delle soluzioni usuali per questo tipo di problema

1

comando Usa vimdiff, questo dà una bella presentazione di differenza

+1

L'ho trovato migliore di 'grep -F -f FILE2 FILE1' – Totalys

Problemi correlati