Posts etiquetados ‘Shell’

Comparación de listas en Unix de tres patadas.

Publicado: marzo 26, 2014 en Unix
Etiquetas:

Por experiencia propia se que en ocasiones requerimos comparar archivos de texto y saber que registros(líneas) están en un archivo o en el otro o en los 2, en algún momento de nuestras vidas nos enfrentamos a esta ardua tarea de comparar listas/archivos por diversas razones, y no queremos hacer uso de un lenguaje de programación como C/Java, etc, y queremos hacer uso de los comandos provistos por Unix.

Para facilitar la explicación vamos a hacer uso de los conjuntos de la siguiente manera:

Conjunto A. Rojo, Verde, Azul, Violeta.
Conjunto B. Negro, Blanco, Gris, Violeta.
Intersección.  Violeta.
Para hacer las comparaciones vamos a usar sort y uniq. También existe una forma alternativa que encontré mientras redactaba el presente documento, la cual no he probado con archivos grandes; está forma hace uso de egrep. Les dejo a su consideración cual método usar asi como el probar cual es el más eficiente. Si alguien desea compartir sus resultados sería excelente.
Primeramente necesitamos filtrar los conjuntos A y B para evitar duplicaciones con esto garantizamos que el primer método funcione correctamente.
root# sort A | uniq | tee Ap

Azul
Rojo
Verde
Violeta

root# sort B | uniq | tee Bp

Blanco
Gris
Negro
Violeta

Ya estamos listos para entonces pasar a la parte medular de las comparaciones de la lista. Lo primero que haremos será sacar la intersección de los 2 archivos.

 root# cat Ap Bp | sort | uniq –d

Violeta

Forma alterna:
root# egrep  -f B A

Violeta

 

En ocasiones a veces solo queremos saber la intersección y con esto es suficiente para esto sin embargo a veces queremos saber más por ejemplo que elementos solo existen en A o en B y para esto hacemos lo siguiente.

 

Para saber los elementos que están en A y que no están en B:
root# cat Ap Bp | sort | uniq -u | cat – Ap | sort | uniq –d

Azul
Rojo
Verde

Forma alterna:
root# egrep -v -f Bp Ap

Rojo
Verde
Azul

Si requerimos saber que está en B y no está en A haremos el caso análogo:
root# cat Ap Bp | sort | uniq -u | cat – Bp | sort | uniq –d

Blanco
Gris
Negro

 

Forma alterna:
root# egrep -v -f A B

Negro
Blanco
Gris

Conclusiones. Como podemos ver hacer comparación de listas es algo trivial en unix y no necesitamos programar nada en un lenguaje de alto nivel, sabemos también que éstos comandos están hechos para hacer trabajo de datawarehouse por lo que tenemos la garantía de que funcionarán con archivos enormes.

Anuncios