Comandos úteis do Linux que ajudam a preprocessar bases de dados
Comandos simples presentes em distribuições Linux que são muito úteis durante o pré-processamento de bases de dados

A todo momento, Engenheiros e Cientistas de Dados precisam tratar e lidar com grandes volumes de dados que, em sua forma “bruta” original, podem ser tarefas impossíveis de serem realizadas utilizado leitores convencionais de planilhas (como Excel, LibreOffice, entre outros) ou diante da ausência de softwares que paralelizem a manipulação de grandes bases de dados no R ou Python, por exemplo.
Muitas bases de dados são disponibilizadas em formato CSV (Comma Separated Values), que pode ser aberto por leitores de texto convencionais em um computador pessoal. No entanto, diante de grandes volumes de dados, essa tarefa torna-se frustrante ou muito lenta quando recursos computacionais são muito limitados (principalmente memória).
Esse será um guia que tem o intuito de apresentar formas básicas de uso de alguns comandos Linux que auxiliam no pré-processamento de bases de dados.
Visão Geral
Os exemplos desse artigo contém comandos do bash Shell (um dos mais populares) e podem ser executados em distribuições Linux populares como Ubuntu, Debian, CentOS, dentre vários outros.
A base de dados utilizada nos exemplos apresentados abaixo é a Bank Marketing [1] (relacionada com campanhas de marketing direto de uma instituição bancária portuguesa), que pode ser obtida livremente no UCI Machine Learning Repository. Basta fazer o download da base e extrair o arquivo bank-full.csv. Não se trata de uma “grande” base de dados, possui apenas 45.211 registros (sem considerar o cabeçalho) e 17 variáveis (ou atributos) que poderiam ser lidas tranquilamente em editores de texto, mas será suficiente para demonstrar os exemplos desse artigo que podem ser executados em bases maiores (ou menores, inclusive).
Antes de iniciarmos com os exemplos, supondo que baixou a base na pasta Downloads, execute o comando cd ~/Downloads para que o diretório de trabalho do Shell mude para esta pasta e você consiga executar os exemplos desse artigo sem problemas. Você pode executar o comando ls -l para ver a lista de arquivos presentes na pasta.

Sem mais demoras, vamos aos exemplos! :)
Contando linhas e palavras com o wc
O comando wc permite visualizar algumas informações interessantes sobre um arquivo, como número de linhas, número de palavras (sequência de caracteres delimitados por espaço) e quantidade de bytes. Uma de suas utilidades é informar a quantidade de linhas de um arquivo ou a quantidade de variáveis de uma base de dados (com o auxílio de outro comando) sem a necessidade de abri-la.
- wc -l bank-full.csv: com este comando você será capaz de visualizar a quantidade de linhas (ou registros) presentes no arquivo (45.212 registros).

Utilizando wc com pipe
Os sistemas operacionais baseados no Unix permitem utilizar a saída de um comando como entrada de outro por meio do uso de pipeline (representado por “|”), que funciona como uma ligação entre comandos. Dessa forma, é possível utilizar vários comandos em conjunto no terminal Linux. Em exemplos posteriores utilizaremos o pipe para mesclar alguns comandos do Linux e com isso extrair mais informações sobre nossa base de dados de exemplo.
Por exemplo, suponha que você queira saber a quantidade de arquivos em uma pasta sem a necessidade de contá-los manualmente, basta utilizar o comando ls em conjunto com o comando wc (ambos citados acima) com o auxílio de um pipe entre eles, conforme pode ser visto na Figura 3.

Para mais opções e informações sobre o comando wc visite a página manual do comando [4] ou digite wc --help no terminal do seu computador.
Visualizando partes de um arquivo com os comandos head e tail
Um comando bastante utilizado durante análises iniciais de bases de dados é o head. Ele permite que apenas uma parte inicial do arquivo seja lida e exibida no terminal. É um comando de fácil utilização que pode ser útil, dentre outras coisas, para visualizar o cabeçalho da base de dados, o separador dos campos dos registros e o preenchimento das informações de alguns registros, conforme pode ser visto na Figura 4.
Por padrão, o comando head exibe as primeiras 10 linhas do arquivo passado como parâmetro no terminal. Dentre outras opções, o head permite que seja informado o número de linhas que o usuário deseja visualizar no terminal, utilizando o parâmetro -n e em seguida o número de linhas que deseja-se serem exibidas.
- head -n 5 bank-full.csv: exibe as primeiras 5 linhas de um arquivo.

O comando tail funciona de forma similar ao head, no entanto ele exibe no terminal as últimas linhas de um arquivo, conforme pode ser visto na Figura 5.

Para mais informações basta utilizar o parâmetro --help dos comandos no terminal ou acessar as referências desse artigo.
Buscando padrões no arquivo com o comando sed
O comando sed é muito útil para filtrar informações e realizar transformações na base de dados. Conhecendo-se um certo padrão presente na base de dados é possível buscar pelas ocorrências dele utilizando esse útil comando.
Por exemplo, suponha que depois de utilizar o head para visualizar alguns registros da base de dados você notou que uma das categorias da variável “job” é “management” e então você deseja filtrar por essa informação sabendo que ela não estará presente em nenhum campo de outra variável da base de dados.
- sed -n ‘/management/p’ bank-full.csv: mostrará no terminal apenas os registros que contenham em algum de seus campos o termo “management”. Caso deseje salvar a saída desse comando em um outro arquivo basta utilizar o operador > e indicar em qual arquivo deseja salvar, por exemplo: sed -n ‘/management/p’ bank-full.csv > bank_management.csv (salvará a saída do comando no arquivo bank_management.csv).
O comando sed é muito poderoso pois, também possibilita fazer transformações em um arquivo. Suponha que deseja substituir o valor “unknown”, presente em alguns campos da base de dados, por algo vazio para que seja detectado por outras ferramentas como um valor faltante (missing/nulo). Para isso, basta utilizar o seguinte comando:
- sed -e ‘s/“unknown”//g’ bank-full.csv: os registros modificados pelo comando serão exibidos no terminal. Caso queira salvar a saída deste comando em um arquivo basta utilizar o mesmo operador citado anteriormente.
Entendendo o comando:
- -e: imprime no terminal, sem alterar o arquivo
- s: permite realizar a substituição de um certo padrão por outro
- “unknown”: é o padrão que o sed procurará no arquivo
- //: o que está entre essas duas barras será o novo valor do padrão, nesse caso significa que o padrão será apagado pois será substituído por nada.
- g: permite realizar substituições globais do padrão, ou seja, buscará todas as ocorrências e não apenas a primeira.
Um outro exemplo interessante é quando deseja-se visualizar certas linhas do arquivo ou verificar quantas variáveis têm a base de dados:
- sed -n ‘50,60p’ bank-full.csv: exibirá os registros entre as linhas 50 e 60.
- head -1 bank-full.csv | sed -e ‘s/;/ /g’: exibirá o cabeçalho no terminal com as variáveis separadas por espaços.
- head -1 bank-full.csv | sed -e ‘s/;/ /g’ | wc -w: exibirá a quantidade de variáveis na base de dados (considerando que o separador dos campos é “;”). Perceba que utilizamos o pipe com os comandos que aprendemos mais acima ;).

São inúmeras as possibilidades que o comando sed oferece, para saber mais leia a documentação do comando no terminal, leia sobre expressões regulares ou busque por exemplos em fóruns na internet ou tutoriais.
Os comandos split e cat
O comando split, como o próprio nome sugere, é utilizado para dividir um arquivo em pedaços. Isso é extremamente útil quando deseja-se tratar uma base de dados muito grande em um computador de uso doméstico, que não conseguirá carregar um grande volume de dados em memória. Dessa forma, o split pode ser utilizado para permitir o pré-processamento de partes menores do arquivo, reduzindo o volume de dados que precisaria ser carregado em memória, para então só depois esses pedaços serem unidos novamente (utilizando o cat) em uma única base tratada.
O split aceita vários parâmetros, mas em nosso exemplo vamos utilizar o parâmetro -l, que permite dividir um arquivo limitando cada parte dessa divisão a um certo número de linhas. Por exemplo:
- split -l 4500 bank-full.csv: dividirá o arquivo em partes que tenham no máximo 4.500 linhas. Por padrão o split salva cada arquivo com o nome xaa, xab, xac e assim por diante.
O comando cat concatena (une) partes de um arquivo em um único arquivo e exibe a saída no terminal.
- cat x* > bank-new.csv: o prefixo * é utilizado para indicar que o cat deverá concatenar todos os arquivos cujos nomes comecem com a letra x e tenham qualquer outra letra depois. A saída do comando, neste exemplo, será salva no arquivo bank-new.csv.

Conclusões
Os sistemas Linux oferecem muitos recursos que auxiliam no pré-processamento de bases de dados. São inúmeras as possibilidades que esses simples comandos oferecem. Conhecê-los permitirá que você tenha mais essas opções em alguma tarefa do pré-processamento e certamente em algum momento utilizará algum deles.
A principal ideia desse artigo é mostrar que existem esses e muitos outros comandos que os ajudarão a preprocessar bases de dados. Os exemplos apresentados acima são bem simples, portanto, recomendo fortemente que leia mais sobre cada um deles, tente utilizá-los e combiná-los.
Qualquer crítica, dúvida ou sugestão fiquem à vontade para entrar em contato.
Referências
- https://www.datacamp.com/community/tutorials/shell-commands-data-scientist
- https://en.wikipedia.org/wiki/Unix
- https://en.wikipedia.org/wiki/Pipeline_(Unix)
- http://man7.org/linux/man-pages/man1/wc.1.html
- http://man7.org/linux/man-pages/man1/head.1.html
- http://man7.org/linux/man-pages/man1/tail.1.html
- http://man7.org/linux/man-pages/man1/split.1.html
- http://man7.org/linux/man-pages/man1/cat.1.html
- http://man7.org/linux/man-pages/man1/sed.1.html
- https://www.tutorialspoint.com/unix/unix-regular-expressions.htm
- https://pt.wikipedia.org/wiki/Expressão_regular
- http://linuxcommand.org/lc3_learning_the_shell.php
- https://archive.ics.uci.edu/ml/datasets/Bank+Marketing