Qual a importância da linha de comando para a Ciência de Dados?
Tags: shell, cienciadedados, bash, mlops
Published: 2022-04-28 02:06:43


Estamos tão acostumados com Interfaces Gráficas de Usuário (Graphical User Interface, GUI) que acabamos deixando passar as maravilhas que podem ser realizadas com uma **Interface de Linha de Comando** (Command-Line Interface, CLI). Além da possibilidade de automatizar tarefas e da maior liberdade garantida pelo acesso às funcionalidades e serviços do sistema operacional, a Interface de Linha de Comando também é uma ferramenta poderosa para o **processamento de dados**. E com a crescente fama da Ciência de Dados, essa funcionalidade não pode passar despercebida. 

Nesse artigo pretendo demonstrar a importância da CLI para a Ciência de Dados e por que devemos aprender a usá-la nesse intuito, ensinando alguns conceitos básicos relacionados ao tratamento de dados. 

_OBS.: Todos os códigos abaixo foram feitos para o shell Bash mas a maioria é aplicável em outros shells._

---


## Comandos Básicos

Antes de iniciarmos vamos fazer uma pequena revisão dos comandos de shell mais utilizados:

![Gif de digitação](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p80k0pp3wnv3w1lw3o5j.gif)

1. `ls [OPÇÃO]... [ARQUIVO]...` : Lista as informações sobre os `ARQUIVO`s (por padrão aqueles que estão dentro do diretório). Ordena as entradas em ordem alfabetica se nem `-cftuvSUX` nem `--sort` foram especificados.
```
Principais argumentos:
-a, –all     { inclui arquivos que começam com . }
-l           { lista arquivos no formato longo }
```

2. `cd [-L|[-P [-e]] [-@]] [dir]` : Muda o diretório de trabalho do shell. O padrão é o diretório HOME.

3. `mkdir [OPÇÃO]...DIRETÓRIO...` : Cria os `DIRETÓRIO`s, caso eles ainda não existam.

4. `rmdir [OPÇÃO]...DIRETORIO...` : Remove os `DIRETÓRIO`s, caso eles estejam vazios.

5. `cp [OPÇÃO]... [-T] FONTE DESTINO` ou `cp [OPÇÃO]... FONTE... DIRETÓRIO` ou `cp [OPÇÃO]... -t DIRETÓRIO FONTE...` : Copia `FONTE` para `DESTINO`, ou mútiplas `FONTE`s para `DIRETÓRIO`.

```
Principais argumentos:
-i, --interactive     { mostra prompt antes de sobrescrever (sobrepõe a opção -n) }
-n, --no-clobber      { não sobrescreve um arquivo existente (sobrepõe a opção -i) }
-R, -r, --recursive   { copia diretórios recursivamente }
```

6. `rm [OPÇÃO]... [ARQUIVO]...` : Remove (desvincula) os `ARQUIVO`s.

```
Principais argumentos:
-f, --force           { ignora arquivos inexistentes e argumentos, não mostra o prompt }
-i                    { mostra prompt antes de cada remoção } 
-r, -R, --recursive   { remove diretórios e seus conteúdos recursivamente }
```

7. `mv [OPÇÃO]... [-T] FONTE DESTINO` ou `mv [OPÇÃO]... FONTE... 
 DIRETÓRIO` ou `mv [OPÇÃO]... -t DIRETÓRIO FONTE...` : Renomeia `FONTE` no `DESTINO`, ou move `FONTE`s para `DIRETÓRIO`. 

```
Principais argumentos:
-f, --force          { não mostra prompt antes de sobrescrever } 
-i, --interactive    { mostra prompt antes de sobrescrever }
-n, --no-clobber     { não sobrescreve um arquivo existente }        

```

---

## Relação com Ciência de Dados
A crescente quantidade de dados diversos no cenário atual obriga o mundo a desenvolver ferramentas que consigam lidar com esse volume de informações, é nesse contexto que surge a Ciência de Dados. Com todos os instrumentos necessários para tratar e processar esses dados, dando vazão aos mesmos. 

Quando escolhemos uma ferramenta ideal para algum trabalho sempre optamos por algo que seja otimizado e de rápido processamento. Nesse contexto, temos as CLIs que permitem a automatização de tarefas, o manuseio de grandes arquivos rapidamente e a organização de dados mais facilmente. 

A partir de agora vou apresentar alguns comandos de shell que são úteis no <u>processamento de dados</u>:

### Inspeção de Dados

1. `head [OPÇÃO]... [ARQUIVO]...` : Imprime as 10 primeiras linhas do `ARQUIVO` na saída padrão. Quando não há `ARQUIVO`, ou quando o `ARQUIVO` é -, o comando lê da entrada padrão.

```
Principais argumentos:
-n, --lines=[-]NUM     { imprime as NUM primeiras linhas ao invés das 10 primeiras }
```

2. `tail [OPÇÃO]... [ARQUIVO]...` : Imprime as 10 últimas linhas do `ARQUIVO`. Quando não há `ARQUIVO`, ou quando o `ARQUIVO` é -, o comando lê da entrada padrão.
```
Principais argumentos:
-n, --lines=[-]NUM     { imprime as NUM primeiras linhas ao invés das 10 primeiras }
```

3. `wc [OPÇÃO]... [ARQUIVO]...` ou `wc [OPÇÃO]... --files0-from=F` : Imprime a contagem de quebra de linha, palavras e bytes para cada `ARQUIVO`, e o númeto total de linhas se mais de um `ARQUIVO` é especificado.

```
Principais argumentos:
-c, --bytes    { imprime a contagem de bytes }
-m, --chars    { imprime a contagem de caracteres } 
-l, --lines    { imprime a contagem de quebras de linha }
-w, --words    { imprime a contagem de palavras }
```

4. column [OPÇÕES] [<ARQUIVOS>...] : Listagem de `ARQUIVO` em colunas.

```
Principais argumentos: 
-t, --table                 { cria uma tabela } 
-s, --separator <string>    { possíveis delimitadores da tabela } 
```

5. `shuf [OPÇÕES]... [ARQUIVO]` ou `shuf -e [OPÇÕES]... [ARGUMENTOS]...` ou `shuf -i LO-HI [OPÇÕES]...` : Escreve uma permutação aleatória das linhas do `ARQUIVO` na saída padrão.
Principais argumentos:
-n, --head-count=COUNT   { a saída tem COUNT linhas }
-o, --output=FILE        { escreve o resultado no ARQUIVO ao invés da saída padrão } 
-r, --repeat             { as linhas da saída podem se repetir } 

6. `file [OPÇÃO...] [ARQUIVO...]` : Determina o tipo dos `ARQUIVO`s.

### Processamento de Dados

1. `cat [OPÇÃO]... [ARQUIVOS]...` : Concatena `ARQUIVO`s na saída padrão. 

2. `sort [OPÇÃO]... [ARQUIVO]...` ou `sort [OPÇÃO]... --files0-from=F` : Escreve uma versão ordenada e concatenada de todos os `ARQUIVO`s na saída padrão.

```
Principais argumentos:
-r, --reverse               { reverte o resultado das comparações } 
-t, --field-separator=SEP   { usa SEP ao invés de um separador não vazio } 
-u, --unique                { imprime apenas a primeira ocorrência de um dado }
-k, --key=KEYDEF            { ordena pela chave (key); KEYDEF fornece a localização e o tipo }
```

3. `cut OPÇÃO... [ARQUIVO]...` : Imprime as partes selecionadas do `ARQUIVO` na saída padrão.

```
Principais argumentos: 
-d, --delimiter=DELIM     { usa DELIM ao invés de TAB para delimitar os campos }

```

4. `grep [OPÇÃO]... PADRÕES [ARQUIVO]...` : Procura PADRÕES em cada ARQUIVO. PADRÕES podem contem múltiplos padrões separados por quebras de linha. 
```
Principais argumentos:
-v, --invert-match     { seleciona linhas que não contém o PADRÃO } 
-n, --line-number      { imprime númeração das linhas na saída padrão }
-i, --ignore-case      { ignora distinções de case nos PADRÕES e nos dados } 
```
```
Exemplo: grep -i 'hello world' main.c
```

### Pipelines
Muitas vezes também podemos querer usar a saída de um comando como a entrada de outro, e para evitar o uso de algum arquivo intermediário podemos conectar os dois comandos da seguinte forma:

```
comando1 | comando2
```

No exemplo acima o `comando2` recebe como entrada a saída do `comando1`. Essa funcionalidade é chamada de _Pipeline_.

---

## Conclusão
Os comandos apresentados tem aplicações variadas e muitos outros argumentos que não foram exibidos aqui. Então podemos ver que a CLI é uma ferramenta realmente preparada para lidar com o processamento de dados, o que nos falta muitas vezes é o conhecimento de tantos comandos e seus argumentos. 

![GIF de computador com tela cheia de comandos](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lpuyd5q7k9651e9xk456.gif)

A proposta do artigo foi mostrar um pouco do que a CLI pode fazer e espero que tenha incentivado alguém a ir além do apresentado e explorar outras funcionalidades relacionadas a Ciência de Dados.