2012-06-19 8 views
23

Ho 2 file con un elenco di numeri (numeri di telefono)Confrontando 2 liste non ordinate in linux, elencando l'unico al secondo file

Sto cercando un metodo di elencare i numeri nel secondo file che non è presente nel primo file

ho provato i vari metodi con:

comm (getting some weird sorting errors) 
fgrep -v -x -f second-file.txt first-file.txt (unsure of the result, there should be more) 

Grazie

+0

Avete controllato questa risposta: http://stackoverflow.com/a/1617326/15165? BTW: prima di fare qualsiasi cosa assicurati di avere tutte le linee finali e gli spazi extra rimossi. Questo potrebbe essere il motivo per cui non li hai trovati tutti ... – bcelary

risposta

47
grep -Fxv -f first-file.txt second-file.txt 

sembra Fondamentalmente per tutte le linee di second-file.txt che non corrispondono a nessuna linea in first-file.txt. Potrebbe essere lento se i file sono grandi.

Inoltre, una volta ordinati i file (utilizzare sort -n se sono numerici), è necessario che anche comm abbia funzionato. Che errore dà? Prova questo:

comm -23 second-file-sorted.txt first-file-sorted.txt 
+0

Sembra fare il trucco, ci sono voluti solo un paio di secondi, con circa 500000 linee nei due file combinati – mvrasmussen

+0

Cool, 500k dovrebbe andare bene sulle macchine moderne. Ma non avrei immaginato che sarebbe stato così veloce ..! La comunicazione funzionava? –

+1

Attenzione, non è possibile utilizzare sort -n con comm, vedere il mio test –

17

È necessario utilizzare comm:

comm -13 first.txt second.txt 

farà il lavoro.

ps. l'ordine del primo e del secondo file nella riga di comando è importante.

anche potrebbe essere necessario per ordinare i file prima:

comm -13 <(sort first.txt) <(sort second.txt) 

nel caso in cui i file sono numerica aggiungere -n opzione per sort.

+0

Che risulta in: comm: il file 2 non è nell'ordine comm: il file 1 non è nell'ordine E un elenco con esattamente lo stesso numero di righe come file2 – mvrasmussen

+0

in modo da poter provare a ordinarli prima. ho appena aggiunto la variante con 'comm' +' sort'. – rush

+1

Ricordare che l'ordinamento numerico dei file potrebbe non funzionare, poiché il comm si aspetta che vengano ordinati in ordine lessicografico. – chepner

6

Questo dovrebbe funzionare

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

Sembra sort -n (numerico) non può funzionare con Comm, che utilizza sort (alfanumerico) internamente

f1.txt

1 
2 
21 
50 

f2.txt

1 
3 
21 
50 

21 dovrebbe apparire nella terza colonna

#WRONG 
$ comm <(sort -n f1.txt) <(sort -n f2.txt) 
       1 
2 
21 
     3 
     21 
       50 

#OK 
$ comm <(sort f1.txt) <(sort f2.txt) 
       1 
2 
       21 
     3 
       50 
2
cat f1.txt f2.txt | sort |uniq > file3 
+0

Sfortunatamente, questo fornisce l'elenco univoco di tutte le linee in entrambi i file e il richiedente cerca solo linee diverse dal file 2. – ingyhere

Problemi correlati