426 lines
No EOL
12 KiB
Markdown
426 lines
No EOL
12 KiB
Markdown
+++
|
|
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! |