+++ title = "Doce herramientas esenciales en línea de comandos para cualquier científicx de datos" date = 2020-10-10T00:00:00+02:00 lastmod = 2022-10-10T15:48:27+02:00 draft = false subtitle = "Libérate del ratón y amplía tu productividad" math = true diagram = true authors = ["adolfo_anton"] [image] caption = "Captura de pantalla de gnome-terminal con la práctica de sed" focal_point = "BottomLeft" placement = 3 preview_only = false +++ Este artículo, publicado originalmente en KDNuggets por [Matthew Mayo](https://www.dataquest.io/blog/author/matthew-mayo/) y republicado [por Dataquest](https://www.dataquest.io/blog/top-12-essential-command-line-tools-for-data-scientists/), lo traduzco sin literalidad en aras de una mayor comprensión. Se considera un rápido vistazo a una docena de herramientas de línea de comandos para sistemas compatibles con el estándar POSIX que pueden ser útiles para tareas realizadas en ciencia de datos. La lista no incluye comandos de gestión de archivos como `pwd`, `ls`, `mkdir`, `rm` o herramientas de gestión de sesiones remotas como `rsh` o `ssh`. Pero sí que son utilidades desde la perspectiva de la ciencia de datos, normalmente en inspección y procesamiento de datos. Suelen estar incluidas en los sistemas operativos compatibles con POSIX. Son ejemplos muy elementales que os anima a complementar por vuestra cuenta cuando sea necesario. En este caso no menciona los manuales tradicionales de estas herramientas sino las entradas de la Wikipedia que considera más amigables para recién llegadxs. ## 1. wget {#1-dot-wget} `wget` es una herramienta para la recuperación (obtención) de archivos, normalmente de recursos remotos. Su uso básico sirve para descargar un archivo, `iris.csv`, un archivo de datos con el que se va a jugar en el resto de los comandos: ```bash wget https://raw.githubusercontent.com/uiuc-cse/data-fa14/gh-pages/data/iris.csv ``` ```bash --2022-10-09 19:18:08-- https://raw.githubusercontent.com/uiuc-cse/data-fa14/gh-pages/data/iris.csv Resolviendo raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.109.133, 185.199.108.133, 185.199.110.133, ... Conectando con raw.githubusercontent.com (raw.githubusercontent.com)[185.199.109.133]:443... conectado. Petición HTTP enviada, esperando respuesta... 200 OK Longitud: 3716 (3,6K) [text/plain] Grabando a: «iris.csv.22» [ ] 0 --.-KB/s iris.csv.22 100%[===================>] 3,63K --.-KB/s en 0s 2022-10-09 19:18:08 (15,5 MB/s) - «iris.csv.22» guardado [3716/3716] ``` ```bash { linenos=true, linenostart=1 } ls iris.csv ``` ```bash iris.csv ``` ## 2. cat {#2-dot-cat} `cat` es una herramienta para mostrar contenidos de archivos en la salida estándar o `STDOUT` y concatenar varios archivos, pudiendo combinarlos, añadirlos al final, numerar las líneas… Una opción es ver el archivo anterior: ```bash { linenos=true, linenostart=1 } cat iris.csv ``` ```bash sepal_length,sepal_width,petal_length,petal_width,species 5.1,3.5,1.4,0.2,setosa 4.9,3,1.4,0.2,setosa 4.7,3.2,1.3,0.2,setosa 4.6,3.1,1.5,0.2,setosa 5,3.6,1.4,0.2,setosa 5.4,3.9,1.7,0.4,setosa 4.6,3.4,1.4,0.3,setosa 5,3.4,1.5,0.2,setosa 4.4,2.9,1.4,0.2,setosa 4.9,3.1,1.5,0.1,setosa 5.4,3.7,1.5,0.2,setosa 4.8,3.4,1.6,0.2,setosa 4.8,3,1.4,0.1,setosa 4.3,3,1.1,0.1,setosa 5.8,4,1.2,0.2,setosa 5.7,4.4,1.5,0.4,setosa 5.4,3.9,1.3,0.4,setosa 5.1,3.5,1.4,0.3,setosa 5.7,3.8,1.7,0.3,setosa 5.1,3.8,1.5,0.3,setosa 5.4,3.4,1.7,0.2,setosa 5.1,3.7,1.5,0.4,setosa 4.6,3.6,1,0.2,setosa 5.1,3.3,1.7,0.5,setosa 4.8,3.4,1.9,0.2,setosa 5,3,1.6,0.2,setosa 5,3.4,1.6,0.4,setosa 5.2,3.5,1.5,0.2,setosa 5.2,3.4,1.4,0.2,setosa 4.7,3.2,1.6,0.2,setosa 4.8,3.1,1.6,0.2,setosa 5.4,3.4,1.5,0.4,setosa 5.2,4.1,1.5,0.1,setosa 5.5,4.2,1.4,0.2,setosa 4.9,3.1,1.5,0.1,setosa 5,3.2,1.2,0.2,setosa 5.5,3.5,1.3,0.2,setosa 4.9,3.1,1.5,0.1,setosa 4.4,3,1.3,0.2,setosa 5.1,3.4,1.5,0.2,setosa 5,3.5,1.3,0.3,setosa 4.5,2.3,1.3,0.3,setosa 4.4,3.2,1.3,0.2,setosa 5,3.5,1.6,0.6,setosa 5.1,3.8,1.9,0.4,setosa 4.8,3,1.4,0.3,setosa 5.1,3.8,1.6,0.2,setosa 4.6,3.2,1.4,0.2,setosa 5.3,3.7,1.5,0.2,setosa 5,3.3,1.4,0.2,setosa 7,3.2,4.7,1.4,versicolor 6.4,3.2,4.5,1.5,versicolor 6.9,3.1,4.9,1.5,versicolor 5.5,2.3,4,1.3,versicolor 6.5,2.8,4.6,1.5,versicolor 5.7,2.8,4.5,1.3,versicolor 6.3,3.3,4.7,1.6,versicolor 4.9,2.4,3.3,1,versicolor 6.6,2.9,4.6,1.3,versicolor 5.2,2.7,3.9,1.4,versicolor 5,2,3.5,1,versicolor 5.9,3,4.2,1.5,versicolor 6,2.2,4,1,versicolor 6.1,2.9,4.7,1.4,versicolor 5.6,2.9,3.6,1.3,versicolor 6.7,3.1,4.4,1.4,versicolor 5.6,3,4.5,1.5,versicolor 5.8,2.7,4.1,1,versicolor 6.2,2.2,4.5,1.5,versicolor 5.6,2.5,3.9,1.1,versicolor 5.9,3.2,4.8,1.8,versicolor 6.1,2.8,4,1.3,versicolor 6.3,2.5,4.9,1.5,versicolor 6.1,2.8,4.7,1.2,versicolor 6.4,2.9,4.3,1.3,versicolor 6.6,3,4.4,1.4,versicolor 6.8,2.8,4.8,1.4,versicolor 6.7,3,5,1.7,versicolor 6,2.9,4.5,1.5,versicolor 5.7,2.6,3.5,1,versicolor 5.5,2.4,3.8,1.1,versicolor 5.5,2.4,3.7,1,versicolor 5.8,2.7,3.9,1.2,versicolor 6,2.7,5.1,1.6,versicolor 5.4,3,4.5,1.5,versicolor 6,3.4,4.5,1.6,versicolor 6.7,3.1,4.7,1.5,versicolor 6.3,2.3,4.4,1.3,versicolor 5.6,3,4.1,1.3,versicolor 5.5,2.5,4,1.3,versicolor 5.5,2.6,4.4,1.2,versicolor 6.1,3,4.6,1.4,versicolor 5.8,2.6,4,1.2,versicolor 5,2.3,3.3,1,versicolor 5.6,2.7,4.2,1.3,versicolor 5.7,3,4.2,1.2,versicolor 5.7,2.9,4.2,1.3,versicolor 6.2,2.9,4.3,1.3,versicolor 5.1,2.5,3,1.1,versicolor 5.7,2.8,4.1,1.3,versicolor 6.3,3.3,6,2.5,virginica 5.8,2.7,5.1,1.9,virginica 7.1,3,5.9,2.1,virginica 6.3,2.9,5.6,1.8,virginica 6.5,3,5.8,2.2,virginica 7.6,3,6.6,2.1,virginica 4.9,2.5,4.5,1.7,virginica 7.3,2.9,6.3,1.8,virginica 6.7,2.5,5.8,1.8,virginica 7.2,3.6,6.1,2.5,virginica 6.5,3.2,5.1,2,virginica 6.4,2.7,5.3,1.9,virginica 6.8,3,5.5,2.1,virginica 5.7,2.5,5,2,virginica 5.8,2.8,5.1,2.4,virginica 6.4,3.2,5.3,2.3,virginica 6.5,3,5.5,1.8,virginica 7.7,3.8,6.7,2.2,virginica 7.7,2.6,6.9,2.3,virginica 6,2.2,5,1.5,virginica 6.9,3.2,5.7,2.3,virginica 5.6,2.8,4.9,2,virginica 7.7,2.8,6.7,2,virginica 6.3,2.7,4.9,1.8,virginica 6.7,3.3,5.7,2.1,virginica 7.2,3.2,6,1.8,virginica 6.2,2.8,4.8,1.8,virginica 6.1,3,4.9,1.8,virginica 6.4,2.8,5.6,2.1,virginica 7.2,3,5.8,1.6,virginica 7.4,2.8,6.1,1.9,virginica 7.9,3.8,6.4,2,virginica 6.4,2.8,5.6,2.2,virginica 6.3,2.8,5.1,1.5,virginica 6.1,2.6,5.6,1.4,virginica 7.7,3,6.1,2.3,virginica 6.3,3.4,5.6,2.4,virginica 6.4,3.1,5.5,1.8,virginica 6,3,4.8,1.8,virginica 6.9,3.1,5.4,2.1,virginica 6.7,3.1,5.6,2.4,virginica 6.9,3.1,5.1,2.3,virginica 5.8,2.7,5.1,1.9,virginica 6.8,3.2,5.9,2.3,virginica 6.7,3.3,5.7,2.5,virginica 6.7,3,5.2,2.3,virginica 6.3,2.5,5,1.9,virginica 6.5,3,5.2,2,virginica 6.2,3.4,5.4,2.3,virginica 5.9,3,5.1,1.8,virginica ``` ## 3. wc {#3-dot-wc} `wc` viene de _word counts_ y sirve para contar palabras, líneas o _bytes_ de archivos de texto. Sin argumentos muestra el número de líneas, palabras, caracteres y el nombre del archivo. ```bash wc iris.csv ``` ```bash 151 151 3716 iris.csv ``` Luego el archivo iris tiene: - 151 líneas - 3716 palabras ## 4. head {#4-dot-head} `head` muestra las primeras diez líneas de un archivo si no se especifican otras opciones. Se puede cambiar el número con la opción `-n`. ```bash head -n 5 iris.csv ``` ```bash sepal_length,sepal_width,petal_length,petal_width,species 5.1,3.5,1.4,0.2,setosa 4.9,3,1.4,0.2,setosa 4.7,3.2,1.3,0.2,setosa 4.6,3.1,1.5,0.2,setosa ``` ## 5. tail {#5-dot-tail} Y para ver la cola del archivo se utiliza `tail`: ```bash tail -n 5 iris.csv ``` ```bash 6.7,3,5.2,2.3,virginica 6.3,2.5,5,1.9,virginica 6.5,3,5.2,2,virginica 6.2,3.4,5.4,2.3,virginica 5.9,3,5.1,1.8,virginica ``` ## 6. find {#6-dot-find} `find` sirve para buscar y encontrar archivos concretos. Primero se pone la ruta, luego el nombre y luego el tipo. Por ejemplo, para buscar `iris.csv` en el directorio actual de trabajo se hace: ```bash find . -name 'iris.csv' -type f ``` ```bash ./iris.csv ``` Si en vez de en el directorio actual de trabajo se quisiera en el directorio del usuario: ```bash find ~/ -name 'iris.csv' -type f ``` ## 7. cut {#7-dot-cut} `cut` se utiliza para cortar secciones de una línea de un archivo de texto. Si son archivos `*sv` será más cómodo. Las dos opciones más usadas o básicas son: - `-d`, donde se indica a continuación entre comillas simples el delimitador de campos. - `-f`, donde se indica el número de columna sobre el que operar. Así, si se ve la primera fila del archivo `iris.csv`: ```bash head -1 iris.csv ``` ```bash sepal_length,sepal_width,petal_length,petal_width,species ``` Se puede acceder a todas las filas de la quinta columna `species` especificando el delimitador `-d ','` con la opción `-f 5`. Para no ver todo entubamos el resultado al comando `head` y vemos las 5 primeras líneas: ```bash cut -d ',' -f 5 iris.csv | head -n 5 ``` ```bash species setosa setosa setosa setosa ``` ## 8. uniq {#8-dot-uniq} `uniq` modifica la salida de los archivos ocultando las líneas consecutivas idénticas en una sola. Como otros comandos, combinado es como se expresa con más potencia. Por ejemplo, se puede saber cuántos valores únicos tiene la quinta columna con la expresión anterior entubada hacia `uniq` con la opción `-c` de _count_. ```bash cut -d ',' -f 5 iris.csv | uniq -c ``` ```bash 1 species 50 setosa 50 versicolor 50 virginica ``` ## 9. awk {#9-dot-awk} `awk` no es solo un comando sino un lenguaje de programación independiente que sirve para procesar y extraer texto. Puede ser utilizado como si fuera un comando desde la terminal. Un uso simple sería buscar la cadena de caracteres `/setosa/` en el archivo `iris.csv` e imprimir todas las líneas donde se ha encontrado con la función `{print}` y la variable `$0`. De nuevo, para no mostrar todas las líneas, se entuba la salida a `head` y se muestran las cinco primeras: ```bash awk '/setosa/ { print $0 }' iris.csv | head -n 5 ``` ```bash 5.1,3.5,1.4,0.2,setosa 4.9,3,1.4,0.2,setosa 4.7,3.2,1.3,0.2,setosa 4.6,3.1,1.5,0.2,setosa 5,3.6,1.4,0.2,setosa ``` ## 10. grep {#10-dot-grep} `grep` es otra herramienta para procesar texto que significa "global regular expression print", impresión de expresiones regulares globales. Por su facilidad para escribir sentencia, procesar cadenas y mostrar resultados es una de las que más se usan habitualmente. La búsqueda anterior de `setosa` sería: ```bash grep setosa iris.csv | head -n 5 ``` ```bash 5.1,3.5,1.4,0.2,setosa 4.9,3,1.4,0.2,setosa 4.7,3.2,1.3,0.2,setosa 4.6,3.1,1.5,0.2,setosa 5,3.6,1.4,0.2,setosa ``` ## 11. sed {#11-dot-sed} `sed` es un "editor de flujo" (de \*s\*/tream/ \*ed\*/itor/ y heredero del editor _ed_), una herramienta de procesamiento y transformación de textos. En este ejemplo se procesa la cadena `setosa` para convertirla en `iris-setosa`: ```bash sed 's/setosa/iris-setosa/g' iris.csv > iris-setosa.csv head -n 5 iris-setosa.csv ``` ```bash sepal_length,sepal_width,petal_length,petal_width,species 5.1,3.5,1.4,0.2,iris-setosa 4.9,3,1.4,0.2,iris-setosa 4.7,3.2,1.3,0.2,iris-setosa 4.6,3.1,1.5,0.2,iris-setosa ``` ## 12. history {#12-dot-history} `history` es muy sencillo y útil. Este comando almacena cada línea que ejecutamos de tal manera que se puede consultar o reutilizar de múltiples formas como una búsqueda recursiva. Entubado a `head` se muestran las últimas 5 líneas: ```bash history | head -n 5 ``` ```bash 1 cut -d ',' -f 5 iris.csv | head -n 5 2 awk '/setosa/ { print $0 }' iris.csv | head -n 5 3 grep setosa iris.csv | head -n 5 4 sed 's/setosa/iris-setosa/g' iris.csv > iris-setosa.csv 5 head -n 5 iris-setosa.csv ``` ## Conclusión {#conclusión} Estos doce comandos se dan en el módulo de [Fundamentos tecnológicos](https://mpvd.es/modulo/01-fundamentos-tecnologicos/) pero, como decía el artículo original, son solo una muestra de lo que es posible hacer en ciencia de datos desde la línea de comandos. Finaliza el artículo con un lema que hemos incorporado al título: > ¡Libérate del ratón y mira cómo crece tu productividad!