Archivos de la categoría ‘Unix’

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

Ahora si, espero escribir algo útil.  Ya que en español no he encontrado algo parecido me atrevo a decir que efectivamente es útil.

Vengo del mundo de los linux y despues me transporte a los BSD’s (FreeBSD para ser más exacto), en estos mundos es trivial la instalación de la triada php-mysql-apache, sin embargo en Solaris me ha costado un poco de trabajo, sobre todo la parte de php y sus múltiples bibliotecas. Por lo tanto voy a tratar de mostrar, cómo también puede resultar trivial la instalación de la triada a través de coolstack que es un paquete óptimizado para Solaris, y que será de lo más fácil su instalación.

Sin más preámbulos entremos a la línea de comandos.

Primero nos bajamos el coolstack(por su puesto si no de donde lo sacamos).
La página del susodicho software es: http://ftp.sunet.se/sun-freeware/coolstack.html en la cual podremos encontrar otra variedad de software como es perl, squid, ruby,  tomcat y lighttpd, los cuales en éste momento no nos interesan(bueno eso espero).

En realidad la página de donde vamos a descargar es: ftp://ftp.sunet.se/pub/vendor/sun/freeware/CSK/ de aquí necesitamos descargar lo siguiente(ya que no dispongo de la plataforma sparc bajaré los correspondientes para intel).

iniciamos con la descompresión de los paquetes:
#bunzip2 CSKamp_1.3.1_i386.pkg.bz2
#bunzip2 CSKruntime_1.3.1_i386.pkg.bz2
#bunzip2 CSKlibsbundle_1.3.1_i386.pkg.bz2

Pasamos a la parte complicada que es instalar los paquetes (por supuesto que se requiere ser root):
#pkgadd -d CSKruntime_1.3.1_i386.pkg

(más…)