2012-01-04 22 views
5

Tengo 2 archivos nix. Todos los datos están en una sola línea en cada archivo. Cada valor está separado por un carácter nulo. Algunos de los valores en la coincidencia de datos.¿Comparar 2 archivos Unix y líneas de coincidencia de salida a un nuevo archivo?

¿Cómo analizaría estos datos en un nuevo archivo enumerando solo los valores coincidentes?

Me imagino que podría usar sed para cambiar los caracteres nulos en nuevas líneas? A partir de ahí, no estoy muy seguro ...

¿Alguna idea?

+4

¿Hay valores duplicados en un solo archivo? Algunos datos de muestra ayudarían. –

+1

¿El posicionamiento haría alguna diferencia, o solo está buscando una existencia que coincida en algún punto del archivo? como dijo @JohnZwinck, los datos de muestra ayudarían. – Radix

+0

El posicionamiento no hace diferencia, puede haber valores duplicados. – rreeves

Respuesta

12

Uso tr, sort y comm:

Conversor nulos en nuevas líneas, y ordenar el resultado:

$ tr '\000' '\n' < file1 | sort > file1.txt 
$ tr '\000' '\n' < file2 | sort > file2.txt 

a continuación, utilizar comm para obtener las líneas que son comunes a los dos archivos:

$ comm -1 -2 file1.txt file2.txt 
<lines shown here are the common lines between file1.txt and file2.txt> 
5

Si no hay valores duplicados en file1 o file2, puede hacer esto:

(tr '\0' '\n' < file1; tr '\0' '\n' < file2) | sort | uniq -c | egrep -v '^ +1' 

Esto contará todos los valores duplicados entre los dos archivos.

Si el orden de los campos es importante, usted puede hacer esto:

comm -1 -2 <(tr '\0' '\n' < file1) <(tr '\0' '\n' < file2) 

Este enfoque no es portátil, se requiere la función de 'proceso de sustitución' de Bash.

1

Esto podría funcionar para usted:

parallel 'tr "\000" "\n" <{} | sort -u' ::: file{1,2} | sort | uniq -d 
Cuestiones relacionadas