2013-03-18 12 views
10

Dal terminale unix, possiamo usare diff file1 file2 per trovare la differenza tra due file. Esiste un comando simile per mostrare la similarità su 2 file? (Molti tubi consentito, se necessario,Come trovare linee duplicate su 2 file diversi? Unix

Ogni file contiene una riga con una frase d'archi; essi sono ordinati e duplicano linee rimosse con sort file1 | uniq

file1:.. http://pastebin.com/taRcegVn

file2: http://pastebin.com/2fXeMrHQ

E l'output dovrebbe produrre le righe che appaiono in entrambi i file

output: http://pastebin.com/FnjXFshs

sono in grado di utilizzare Python per farlo come tale ma penso che sia un po 'troppo da mettere nel terminale:

x = set([i.strip() for i in open('wn-rb.dic')]) 
y = set([i.strip() for i in open('wn-s.dic')]) 
z = x.intersection(y) 
outfile = open('reverse-diff.out') 
for i in z: 
    print>>outfile, i 
+0

Che cosa i vostri file assomigliano? – paulmelnikow

+3

possibile duplicato di [come mostrare le linee in comune (reverse diff)?] (Http://stackoverflow.com/questions/746458/how-to-show-lines-in-common-reverse-diff) – tjameson

+0

Più volte a stringa di frasi in linguaggio umano. Talvolta sono disponibili anche maggiori informazioni. – alvas

risposta

9

Come @tjameson dicono che può essere risolto in un altro thread. Proprio vorrebbe inviare un'altra soluzione: sort file1 file2 | awk 'dup[$0]++ == 1'

  1. riferiscono a awk guide per ottenere alcuni awk nozioni di base, quando il valore del modello di una linea è vera questa linea verrà stampato

  2. dup [ $ 0] è una tabella hash in cui ogni chiave è ogni riga dell'input, il valore originale è 0 e incrementi una volta che questa riga si verifica, quando si verifica nuovamente il valore dovrebbe essere 1, quindi dup[$0]++ == 1 è true. Quindi questa riga viene stampata.

Si noti che questo funziona solo quando non ci sono duplicati in entrambi i file, come è stato specificato nella domanda.

+0

Puoi spiegare come funziona 'awk 'dup [$ 0] ++ == 1''?La tua soluzione è molto meglio del confuso 'comm' – alvas

+0

@ 2er0 la risposta è aggiornata –

+1

' awk' usa la notazione 'pattern {action}'. Poiché questo non è in parentesi graffe, è un modello. '$ 0' è la riga corrente. 'dup [$ 0]' è un array associativo indicizzato dalle linee; quando viene creato per la prima volta, il valore è 0; 'dup [$ 0] ++' post-incrementa il valore, quindi restituisce 0 la prima volta e 1 alla seconda volta, ecc. Quando il suo valore è 1, la condizione è vera, quindi l'azione predefinita (stampa la riga) viene eseguito. –

24

Se si desidera ottenere un elenco di linee ripetute senza ricorrere a AWK, è possibile utilizzare -d flag to uniq:

sort file1 file2 | uniq -d 
+1

Per utilizzare lo strumento più semplice per raggiungere l'obiettivo. –

+0

Inoltre, l'eliminazione di -d consente di ottenere tutte le linee distinte da entrambi i file, che è ciò che stavo cercando. – Aaron

Problemi correlati