+++
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-10T16:01:03+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 se basa en "Top 12 Essential Command Line Tools for Data Scientists", publicado originalmente en [KDNuggets](https://www.kdnuggets.com/2018/03/top-12-essential-command-line-tools-data-scientists.html) por [Matthew Mayo](https://www.dataquest.io/blog/top-12-essential-command-line-tools-for-data-scientists/) (2018) 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](https://es.wikipedia.org/wiki/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&#x2026;

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!