2012-06-19 6 views
23

Tengo 2 archivos con una lista de números (números de teléfono)Comparando 2 listas sin ordenar en Linux, la lista única en el segundo archivo

Estoy en busca de un método de la inclusión de los números en el segundo archivo que no está presente en el primer archivo

he intentado varios métodos 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) 

Gracias

+0

¿Ha comprobado que esta respuesta: http://stackoverflow.com/a/1617326/15165? Por cierto: antes de hacer cualquier cosa, asegúrese de haber eliminado todas las líneas finales y espacios en blanco adicionales. Esta podría ser la razón por la que no ha encontrado todos ellos ... – bcelary

Respuesta

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

ve Básicamente para todas las líneas en second-file.txt que no coinciden con ninguna línea en first-file.txt. Puede ser lento si los archivos son grandes.

Además, una vez que haya ordenado los archivos (use sort -n si son numéricos), entonces comm también debería haber funcionado. ¿Qué error le da? Prueba esto:

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

Parece que fue el truco, tomó solo un par de segundos, con aproximadamente 500000 líneas en los dos archivos combinados – mvrasmussen

+0

Enfriar, 500k debería estar bien en las máquinas modernas. ¡Pero no hubiera imaginado que sería tan rápido ...! ¿Funcionó el comunicador? –

+1

Advertencia, no puede usar sort -n con comm, vea mi prueba –

17

Es necesario utilizar comm:

comm -13 first.txt second.txt 

hará el trabajo.

ps. orden del primer y segundo archivo en asuntos de línea de comando.

también puede que tenga que ordenar los archivos antes:

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

en caso de archivos son numéricos añadir -n opción de sort.

+0

que se traduce en: comm: 2 archivo no está ordenada comm: 1 archivo no está ordenada y una lista con exactamente el mismo número de líneas como archivo2 – mvrasmussen

+0

, por lo que puede intentar ordenarlos antes. Acabo de agregar la variante con 'comm' +' sort'. – rush

+1

Tenga en cuenta que la clasificación de los archivos numéricamente puede no funcionar, como comunicador espera que sean ordenados lexicográfico. – chepner

6

Esto debería funcionar

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

Parece tipo -n (numérico) no puede trabajar con comunicación, que utiliza una especie (alfanumérico) internamente

f1.txt

1 
2 
21 
50 

f2.txt

1 
3 
21 
50 

21 debe aparecer en tercera columna

#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

Desafortunadamente, esto proporciona la lista única de todas las líneas en ambos archivos, y el solicitante solo busca líneas diferentes del archivo 2. – ingyhere

Cuestiones relacionadas