Carlos Pérez me preguntó el otro día por alguna utilidad para ver las diferencias entre dos archivos, pero sin tener en cuenta si las líneas estaban ordenadas y demás.
La idea era que de dos listados de cosas quería sacar los elementos que estaban en la primera lista, pero no en la segunda. Concretamente eran listados de paquetes instalados.[1]
Esto mismo me lo he encontrado yo muchas veces, o cosas muy parecidas. Puedes ordenar las listas y hacer un diff, pero si hay elementos que están en la primera y no en la segunda y otros que están en la segunda pero no en la primera, se suele joder el tema.
Seguro que hay alguna utilidad para resolver este problema, pero como ya me lo he encontrado muchas veces y las veces que he buscado, no he encontrado nada y he tenido que hacer locuras para solucionarlo. Así que decidí hacerme un script muy chorra en python, para resolver mi problema.
Además, tenía ganas de programar algo en python, para recordar y de paso hacer pruebillas de cosas (python, codestyle, hg, convenciones, etc).
Es también para tener el típico ejemplo para crear scripts de python, con su cabecera, comentarios que tiren bien en pydoc, la licencia, normas de estilo, encoding, configuración para el vim, etc.
Bueno, si tras todo este rollo alguien quiere echarle un ojo, usarlo, tirarle piedras, copiarlo, mejorarlo o lo que sea, aquí lo tiene publicado:
http://hg.emergya.info/~jojeda/listdiff Y si quieren directamente bajarse el repo para hacerle mejoras o su propia versión o experimentos:
$ hg clone
http://hg.emergya.info/~jojeda/listdiff Supongo que la mayoría lo sabe, pero para los que no,'hg' es el sistema de control de versiones (algo como nuestro subversion) "Mercurial" y que viene en el paquete de Ubuntu/Guadalinex "mercurial":
$ sudo apt-get install mercurial
Saludos y happy hacking
;-)[1] El caso que comentaba:
# En una máquina (host-A)
host-A$ dpkg -l | awk '/^ii/ {print $2}' > host-B_pkgs.lst
# En otra (host-B)
host-B$ dpkg -l | awk '/^ii/ {print $2}' > host-B_pkgs.lst
# Ya en tu directorio de trabajo, con los dos archivos copiados
$ wc -l host-?_pkgs.lst
2061 host-A_pkgs.lst
2059 host-B_pkgs.lst
4120 total
# Hay 2 paquetes menos en host-B
# Veamos cuales:
$ ./listdiff.py host-A_pkgs.lst host-B_pkgs.lst
ant
ant-optional
et voilá