Quando alguém fala em “limpar dados”, a primeira imagem que costuma vir à cabeça é abrir um Jupyter Notebook e começar a brincar com pandas. Mas tem uma coisa que pouca gente lembra: uma parte bem poderosa dessa faxina pode acontecer direto no terminal, usando ferramentas que já vêm instaladas no sistema.
Aqui você vai ver como usar utilitários básicos de linha de comando para limpar, transformar e explorar arquivos de dados. Nada de instalar mil coisas: só o seu terminal aberto e alguns arquivos CSV na pasta, como se você estivesse mexendo numa planilha cheia de problemas de cadastro de clientes.
Antes de sair digitando comando, vale entender por que isso é tão útil no dia a dia:
- Ferramentas de linha de comando são simples de usar, rápidas e eficientes, principalmente quando o arquivo é grande, tipo log de sistema, extrato gigante em CSV ou export de ERP.
- Elas já vêm no Linux e no macOS, e existem versões para Windows também.
- São ótimas para dar aquela primeira olhada nos dados antes de carregar tudo no Python ou em outra linguagem.
- É fácil encadear comandos em scripts e reaproveitar essa rotina de limpeza como parte de uma automação, seja num cron job, num pipeline de dados ou num script de manutenção.
Vamos colocar a mão no teclado.
Dica: imagine que este texto está acompanhado de um script Bash em um repositório no GitHub. A ideia é que você abra o terminal, deixe o arquivo ao lado e vá copiando os comandos para sentir na pele como funciona.
Criando um conjunto de dados “sujo”
Primeiro passo: montar um CSV bem bagunçado para brincar. Ele simula problemas reais que aparecem em cadastro de RH, planilhas de vendas, lista de alunos e por aí vai.
cat > messy_data.csv << 'EOF'
name,age,salary,department,email
John Lee,32,50000,Engineering,john@example.com
Jane Smith,28,55000,Marketing,jane@example.com
Bob Davis ,35,60000,Engineering,bob@example.com
Alice Williams,29,,Marketing,alice@example.com
Charlie Brown,45,70000,Sales,charlie@example.com
Dave Wilson,31,52000,Engineering,
Emma Davis,,58000,Marketing,emma@example.com
Frank Miller,38,65000,Sales,frank@example.com
John Lee,32,50000,Engineering,john@example.com
Grace Lee,27,51000,Engineering,grace@example.com
EOF
Esse mini–conjunto de dados já vem com vários problemas típicos: espaço sobrando antes e depois de alguns nomes, valores faltando, linhas duplicadas. É o tipo de coisa que aparece quando você junta dados de sistemas diferentes, importa planilhas de várias pessoas ou baixa relatórios de plataformas distintas. Ótimo cenário para aprender.
1. Explorando seus dados com head, tail e wc
Antes de tentar arrumar qualquer coisa, você precisa entender com o que está lidando. É como abrir um armário bagunçado e dar aquela primeira olhada antes de decidir o que vai pro lixo, o que vai pra doação e o que volta pra prateleira.
# Ver as 5 primeiras linhas (incluindo o cabeçalho)
head -n 5 messy_data.csv
# Ver as 3 últimas linhas
tail -n 3 messy_data.csv
# Contar o total de linhas (incluindo o cabeçalho)
wc -l messy_data.csv
O que está rolando aqui?
-
head -n 5mostra as 5 primeiras linhas, uma prévia rápida para ver se o formato do arquivo está dentro do esperado. -
tail -n 3mostra as 3 últimas, ótimo para checar se o arquivo terminou direito ou se ficou alguma linha cortada no final. -
wc -lconta quantas linhas existem; tirando 1 (do cabeçalho), você descobre quantos registros tem de verdade.
Saída de exemplo:
name,age,salary,department,email
John Lee,32,50000,Engineering,john@example.com
Jane Smith,28,55000,Marketing,jane@example.com
Bob Davis ,35,60000,Engineering,bob@example.com
Alice Williams,29,,Marketing,alice@example.com
Frank Miller,38,65000,Sales,frank@example.com
John Lee,32,50000,Engineering,john@example.com
Grace Lee,27,51000,Engineering,grace@example.com
11 messy_data.csv
É como dar aquela olhada rápida numa planilha no LibreOffice só para ver se os dados “parecem” certos.
2. Visualizando colunas específicas com cut
Nem sempre você quer ver o arquivo todo. Às vezes, só quer saber o nome das pessoas e o setor onde trabalham, tipo quando sua chefe pede “me manda só a lista de nomes com o departamento, o resto não importa”.
cut -d',' -f1,4 messy_data.csv
Entendendo por partes:
-
cuté uma ferramenta para “recortar” pedaços de cada linha. -
-d','diz qual é o separador de campos; aqui é vírgula, como em qualquer CSV padrão. -
-f1,4indica que você quer as colunas 1 e 4 (name e department).
Você também pode usar intervalos de colunas: -f1-3 pegaria as colunas de 1 até 3.
Saída:
name,department
John Lee,Engineering
Jane Smith,Marketing
Bob Davis ,Engineering
Alice Williams,Marketing
Charlie Brown,Sales
Dave Wilson,Engineering
Emma Davis,Marketing
Frank Miller,Sales
John Lee,Engineering
Grace Lee,Engineering
Isso lembra muito filtrar colunas numa planilha, só que aqui você faz com um comando de uma linha e pode encaixar isso num script reutilizável.
3. Removendo linhas duplicadas com sort e uniq
Reparou que “John Lee” aparece duas vezes no arquivo? Em bancos de dados reais isso é clássico: cadastro duplicado de cliente, aluno repetido, funcionário que entrou duas vezes na lista de pagamento.
Vamos tratar isso.
# Salvar o cabeçalho primeiro
head -n 1 messy_data.csv > cleaned_data.csv
# Remover duplicatas do restante (sem o cabeçalho)
tail -n +2 messy_data.csv | sort | uniq >> cleaned_data.csv
O que cada parte faz?
-
head -n 1pega só a primeira linha, o cabeçalho, e salva emcleaned_data.csv. -
tail -n +2pega tudo a partir da segunda linha, pulando o cabeçalho. -
sortordena as linhas; isso é importante porque ouniqsó consegue remover duplicatas que estão uma abaixo da outra. -
uniqelimina linhas repetidas adjacentes. -
>>acrescenta o resultado ao final do arquivo (em vez de sobrescrever como>faria).
É como pegar uma lista de chamada, ordenar por nome e riscar os duplicados, deixando tudo organizadinho.
4. Buscando e filtrando com grep
Agora vamos falar de buscas e filtros. Quer localizar só quem está no setor de Engenharia? Ou encontrar linhas com campo vazio? A ferramenta que resolve isso direto no terminal é o grep.
# Encontrar todas as linhas de Engenharia
grep "Engineering" messy_data.csv
# Encontrar linhas com campos vazios (duas vírgulas seguidas)
grep ",," messy_data.csv
# Excluir linhas com dados faltando
grep -v ",," messy_data.csv > no_missing.csv
Como funciona:
-
grep "padrão"procura por linhas que contenham aquele texto. -
grep -vfaz o contrário: mostra só as linhas que não batem com o padrão. - No caso de
",,", estamos assumindo que um valor faltando vira duas vírgulas seguidas, algo comum quando um campo num CSV fica em branco.
Isso é muito útil quando você quer, por exemplo, separar uma lista “limpa” de clientes com todos os campos preenchidos e outra lista só com os registros problemáticos para corrigir depois.
5. Tirando espaços em excesso com sed
Repara no registro de “Bob Davis”: o nome está com espaços sobrando antes e depois. Isso atrapalha na hora de comparar, agrupar ou até de mostrar o nome num relatório bonitinho.
Vamos remover esse excesso.
sed 's/^[ \t]*//; s/[ \t]*$//' messy_data.csv > trimmed_data.csv
O que está acontecendo aqui?
-
sedé um “editor de fluxo”, uma ferramenta para editar texto enquanto ele passa pelo comando, sem abrir editor gráfico. -
s/padrão/substituição/é a sintaxe de substituição. -
^[ \t]*combina espaços ou tabulações no começo da linha. -
[ \t]*$combina espaços ou tabulações no fim da linha. - O ponto e vírgula separa duas operações: primeiro limpamos o começo, depois o final.
Em termos práticos, é como usar “remover espaços extras” numa planilha, só que em qualquer arquivo texto que estiver passando pelo seu pipeline.
6. Substituindo valores com sed
Às vezes você precisa padronizar termos ou corrigir um erro de digitação. Imagine que o setor “Engineering” precisasse aparecer como “Tech” nos relatórios internos.
# Trocar todas as ocorrências de "Engineering" por "Tech"
sed 's/Engineering/Tech/g' messy_data.csv
Agora, vamos supor que você queira preencher e-mails vazios com um valor padrão, do tipo “no-email@example.com”, só para não deixar o campo em branco em nenhuma linha.
# Substituir e-mails vazios por "no-email@example.com"
sed 's/,$/,no-email@example.com/' messy_data.csv
Entendendo o comando:
- O
gno final significa “global”: substitui todas as ocorrências na linha, não apenas a primeira. -
,$identifica uma vírgula no final da linha, sinal de que o último campo está vazio. - Você pode emendar várias substituições usando
;entre elas.
É como fazer “localizar e substituir” num editor de texto, mas com a vantagem de rodar isso em scripts e automatizar a correção sempre que um arquivo novo chegar.
7. Contando e resumindo com awk
O awk é uma espécie de canivete suíço quando você precisa trabalhar com campos, somas e estatísticas simples. Vamos usar para analisar um pouco o nosso arquivo.
# Contar registros por departamento
tail -n +2 messy_data.csv | cut -d',' -f4 | sort | uniq -c
# Calcular idade média (ignorando cabeçalho e valores vazios)
tail -n +2 messy_data.csv | awk -F',' '{if($2) sum+=$2; if($2) count++} END {print "Average age:", sum/count}'
O que esse awk faz?
-
-F','define a vírgula como separador de campos. -
$2é o segundo campo, nossa coluna de idade. -
if($2)garante que só vamos considerar linhas em que a idade não está vazia. -
sum += $2vai acumulando as idades. -
count++conta quantos registros válidos entraram no cálculo. - O bloco
END { ... }roda depois de passar por todas as linhas e imprime a média.
Saída típica:
5 Engineering
3 Marketing
2 Sales
Average age: 33
É como pedir para o Excel fazer uma Tabela Dinâmica e uma média, só que tudo na linha de comando. Útil pra caramba quando você está no servidor sem interface gráfica ou montando um job automatizado.
8. Combinando comandos com pipes
A verdadeira força da linha de comando aparece quando você começa a encadear várias ferramentas usando o famoso |, o “pipe”. Ele pega a saída de um comando e joga direto como entrada do próximo.
# Pegar departamentos únicos, em ordem alfabética
tail -n +2 messy_data.csv | cut -d',' -f4 | sort | uniq
# Encontrar engenheiros com salário > 55000
tail -n +2 messy_data.csv | grep "Engineering" | awk -F',' '$3 > 55000' | cut -d',' -f1,3
# Contar funcionários por departamento, com contagem
tail -n +2 messy_data.csv | cut -d',' -f4 | sort | uniq -c | sort -rn
Aqui acontece o seguinte:
- Cada
|passa o resultado do comando anterior para o seguinte. - Você monta uma espécie de “esteira” de processamento, como linha de produção de fábrica: um comando recorta, outro filtra, outro agrupa, outro ordena.
- No último exemplo,
sort -rnordena em ordem numérica reversa (dos maiores para os menores).
Saída ilustrativa:
Engineering
Marketing
Sales
Bob Davis ,60000
5 Engineering
3 Marketing
2 Sales
Dá para perceber como as peças vão se encaixando? Você começa com um CSV simples e, em poucos comandos, tem um mini–relatório pronto.
9. Convertendo formatos de dados
Em alguns momentos você precisa mudar o “jeito” do arquivo, seja para importar em outro sistema, seja para abrir melhor em alguma ferramenta. Um caso comum é trocar vírgulas por tabulações, criando um TSV.
# Converter CSV para TSV (tab separado)
sed 's/,/\t/g' messy_data.csv > data.tsv
Agora vamos adicionar uma coluna fixa, por exemplo, o ano “2024” para todas as linhas. Pode ser algo como o ano do relatório ou da base de referência.
awk -F',' 'BEGIN{OFS=","} {print $0, "2024"}' messy_data.csv > data_with_year.csv
Detalhando esse awk:
-
BEGIN{OFS=","}define que o separador de saída será vírgula. -
$0representa a linha inteira de entrada. -
print $0, "2024"imprime a linha original e, na sequência, a nova coluna “2024”.
É jeito rápido de enriquecer seus dados sem abrir editor algum, como se você estivesse inserindo uma coluna inteira numa planilha com o mesmo valor para todo mundo.
10. Montando um pipeline completo de limpeza
Agora vamos juntar tudo em um fluxo só, uma sequência de comandos que pega o arquivo sujo e cospe um arquivo bem mais apresentável.
# Salvar o cabeçalho
head -n 1 messy_data.csv > final_clean.csv
# Limpar os dados: remover duplicatas, aparar espaços, excluir linhas com faltas
tail -n +2 messy_data.csv | \
sed 's/^[ \t]*//; s/[ \t]*$//' | \
grep -v ",," | \
sort | \
uniq >> final_clean.csv
echo "Cleaning complete! Check final_clean.csv"
O que esse pipeline faz, na prática?
- Garante que o cabeçalho fique preservado, indo direto para
final_clean.csv. - Pula o cabeçalho e trabalha só nas linhas de dados.
- Remove espaços extras no começo e no fim de cada linha.
- Joga fora qualquer linha que tenha valores faltando (detectados pelo
",,"). - Ordena as linhas e elimina duplicatas.
- Anexa o resultado limpo ao arquivo final.
É quase como criar um “filtro inteligente” para planilhas, só que em forma de script. Você pode rodar isso todo dia em um diretório de arquivos novos, por exemplo, e ter sempre dados mais organizados antes de mandar para o banco ou para o Python.
Encerrando a ideia
Limpar dados na linha de comando é uma habilidade silenciosa, que não aparece em gráfico bonito, mas que faz uma diferença enorme na vida de quem lida com CSV, logs, exportações de sistemas e planilhas bagunçadas. Essas ferramentas são rápidas, confiáveis e convivem muito bem com Python e outras linguagens: você continua usando seus notebooks, só que chega neles com menos sujeira.
O mais interessante é que tudo isso não serve só para quem se vê como “cientista de dados”. Manipular dados direto no terminal ajuda em engenharia de dados, DevOps, administração de sistemas e qualquer rotina em que você precise mexer com arquivos de texto grandes de forma repetitiva.
Se você começar a praticar com seus próprios arquivos — lista de clientes, extrato exportado do banco, CSV de vendas da loja online, relatório de sistema acadêmico — vai perceber que muita tarefa chata some da sua rotina. E, com o tempo, vai ter cada vez mais vontade de resolver pequenos problemas de dados com meia dúzia de comandos no terminal em vez de abrir um notebook pesado só para uma limpeza rápida.
Top comments (1)
Curti! Esse uso de terminal lembra o “Unix Philosophy”: programas simples encadeados como pequenos pipelines de ETL.