cmdchallenge.com Desafios en el CLI BASH

Hace un tiempo  un amigo @root_w33d me aviso que existia un proyecto conocido como “cmd challenge” (reto en comandos):

Cuando vi el mensaje me puse a revisar el proyecto el cual se me hizo muy interesante, tras una larga noche de bastante café, complete los desafíos:

cmdchallenger
https://cmdchallenge.com

Como no es mi intensión spoolear las respuestas, solo voy a poner las que considere interesantes, cabe mencionar que si revisas el repositorio del proyecto en github puedes ver las respuestas de cada desafió en la URL:

https://github.com/jarv/cmdchallenge/blob/master/challenges.yaml

remove_duplicate_lines

Description:

Print the file faces.txt, but only print the first instance of each
duplicate line, even if the duplicates don't appear next to each other.
Note that order matters so don't sort the lines before removing duplicates.

Consiste en imprimir las lineas de un archivo faces.txt(de 31 lineas) sin imprimir las lineas repetidas manteniendo el orden.

Fue entonces que de inmediato pensé en el comando uniq el cual en teoría elimina las lineas repetidas sin embargo, creo que no funciona del todo correcto cuando existen caracteres especiales, de tal forma que el resultado de:

uniq faces.txt

Nos devuelve 28 lineas lo cual me indicaba que eliminaba 3 lineas.

Cabe mencionar que el resultado esperado consta de 24 lineas, por un momento pensé que quizás el problema es que como las lineas repetidas no estaban continuas pues por eso el uniq no funcionaba bien, asi que pensé en ordenar y luego eliminar los elementos repetidos para ver que pasaba:

sort faces.txt | uniq

lo cual ya me genera las 24 lineas el problema ahora es que al ordenar, se pierde la secuencia, así que opte por ejecutar:

cat -n faces.txt | sort -k2 -u | sort | cut  -f2- 

el cual realiza el siguiente procedimiento:

  • cat -n faces.txt imprime las lineas agregando el numero de linea (algo similar a ejecutar nl faces.txt)
  • sort -k2 -uOrdena eliminando las lineas repetidas(-u) a partir del 2do parametro(-k2)
  • sortSimplemente ordena, regresando el orden del archivo.
  • cut -f2-Corta la salida a partir del parámetro 2.

Cabe mencionar que la respuesta oficial del repositorio es awk '!x[$0]++' faces.txt pero como todos sabemos en bash podemos hacer las cosas de muchas maneras 😉

Por otra parte hoy que escribí el post me doy cuenta que hay nuevos desafíos, así que asta aquí los dejo, ya que me pondré a jugar un ratito, esperando posteriormente escribir nuevas soluciones que me parecieron interesante =).

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s