Trabalhando com CSV e TSV no terminal
1. Fundamentos: Entendendo CSV e TSV
CSV (Comma-Separated Values) e TSV (Tab-Separated Values) são formatos de arquivo tabular amplamente utilizados para armazenar e trocar dados estruturados. Ambos organizam informações em linhas, onde cada linha representa um registro e os campos são separados por um caractere delimitador específico.
No CSV, o delimitador é a vírgula (,), enquanto no TSV utiliza-se a tabulação (\t). A estrutura básica inclui um cabeçalho opcional na primeira linha, seguido pelos dados propriamente ditos. Armadilhas comuns incluem campos contendo vírgulas internas (no CSV) ou tabulações (no TSV), que exigem tratamento especial com aspas.
Para inspeção rápida, ferramentas nativas do terminal são indispensáveis:
# Visualizar as primeiras 5 linhas de um CSV
head -n 5 dados.csv
# Visualizar as últimas 3 linhas de um TSV
tail -n 3 dados.tsv
# Contar o número total de linhas (incluindo cabeçalho)
wc -l dados.csv
# Exibir conteúdo completo
cat dados.csv
2. Leitura e Visualização de Dados Tabulares
Exibir dados tabulares de forma legível é essencial. O comando column formata a saída em colunas alinhadas:
# Formatando CSV com vírgulas
column -t -s, dados.csv
# Formatando TSV com tabulações
column -t -s$'\t' dados.tsv
Para navegação específica por linhas:
# Exibir linhas 10 a 20 com sed
sed -n '10,20p' dados.csv
# Exibir registros pares com awk
awk 'NR % 2 == 0' dados.csv
# Visualizar apenas o cabeçalho
awk 'NR==1' dados.csv
# Contar registros (excluindo cabeçalho)
tail -n +2 dados.csv | wc -l
3. Filtragem e Seleção de Colunas
Extrair colunas específicas é uma operação frequente. O comando cut é ideal para isso:
# Extrair primeira e terceira colunas de um CSV
cut -d',' -f1,3 dados.csv
# Extrair segunda coluna de um TSV (tabulação é o delimitador padrão do cut)
cut -f2 dados.tsv
Para filtragem por padrões ou condições numéricas, awk oferece maior flexibilidade:
# Filtrar linhas que contêm "Brasil"
awk -F',' '/Brasil/' dados.csv
# Filtrar registros onde a terceira coluna é maior que 100
awk -F',' '$3 > 100' dados.csv
# Combinar: selecionar colunas 1 e 4 apenas para linhas com "Ativo"
awk -F',' '/Ativo/ {print $1, $4}' dados.csv
4. Ordenação e Deduplicação
O comando sort permite ordenar dados de diversas maneiras:
# Ordenar por segunda coluna (alfabética)
sort -t',' -k2 dados.csv
# Ordenar por terceira coluna (numérica, decrescente)
sort -t',' -k3 -n -r dados.csv
# Ordenar estável (preservando ordem original em empates)
sort -t',' -k2 -s dados.csv
Para remover duplicatas:
# Remover linhas duplicadas (considerando a linha inteira)
sort -u dados.csv
# Remover duplicatas preservando a ordem original
awk '!seen[$0]++' dados.csv
# Tratar cabeçalho: ordenar apenas dados, mantendo cabeçalho no topo
head -1 dados.csv > cabecalho.csv
tail -n +2 dados.csv | sort -t',' -k2 >> cabecalho.csv
mv cabecalho.csv dados_ordenados.csv
5. Transformações e Manipulação de Dados
Substituir delimitadores é uma transformação comum:
# Converter CSV para TSV com sed
sed 's/,/\t/g' dados.csv > dados.tsv
# Converter CSV para TSV com tr
tr ',' '\t' < dados.csv > dados.tsv
Adicionar, remover e renomear colunas com awk:
# Adicionar coluna calculada (preço * quantidade)
awk -F',' '{print $0, $2 * $3}' OFS=',' dados.csv
# Remover segunda coluna
awk -F',' '{print $1, $3, $4}' OFS=',' dados.csv
# Renomear coluna no cabeçalho
awk -F',' 'NR==1 {print "ID,Nome,Total"} NR>1 {print $0}' dados.csv
Operações aritméticas e agregações:
# Somar valores da segunda coluna
awk -F',' '{sum+=$2} END {print "Soma:", sum}' dados.csv
# Calcular média da terceira coluna
awk -F',' '{sum+=$3; count++} END {print "Média:", sum/count}' dados.csv
6. Junção (Join) de Arquivos CSV/TSV
O comando join cruza dados de dois arquivos por uma chave comum. Os arquivos devem estar ordenados pela chave:
# Ordenar ambos os arquivos pela chave (coluna 1)
sort -t',' -k1 clientes.csv > clientes_ord.csv
sort -t',' -k1 pedidos.csv > pedidos_ord.csv
# Realizar o join (coluna 1 de ambos os arquivos)
join -t',' -1 1 -2 1 clientes_ord.csv pedidos_ord.csv > resultado.csv
Para simular LEFT JOIN com awk:
awk -F',' '
NR==FNR {dados[$1]=$0; next}
{
if ($1 in dados)
print $0, dados[$1]
else
print $0, "NA"
}' clientes.csv pedidos.csv
Lidando com cabeçalhos duplicados:
awk -F',' '
NR==1 {print $0; next}
{
if (!($1 in vistos)) {
vistos[$1] = 1
print $0
}
}' arquivo.csv
7. Boas Práticas e Tratamento de Casos Especiais
CSV complexo (com aspas, vírgulas internas) exige ferramentas especializadas. O csvkit oferece soluções robustas:
# Instalar csvkit
pip install csvkit
# Usar csvcut para selecionar colunas
csvcut -c 1,3 dados_complexos.csv
# Usar csvgrep para filtrar
csvgrep -c 2 -m "Padrão" dados_complexos.csv
# Converter CSV complexo para TSV com segurança
csvformat -T dados_complexos.csv > dados_saida.tsv
Scripts reutilizáveis para validação:
#!/bin/bash
validar_csv() {
local arquivo=$1
local delimitador=${2:-,}
local linhas=$(wc -l < "$arquivo")
local colunas=$(head -1 "$arquivo" | awk -F"$delimitador" '{print NF}')
echo "Arquivo: $arquivo"
echo "Linhas: $linhas"
echo "Colunas: $colunas"
# Verificar consistência
awk -F"$delimitador" -v esperado="$colunas" '
NR>1 && NF != esperado {
print "Linha " NR " tem " NF " campos (esperado: " esperado ")"
}' "$arquivo"
}
# Uso
validar_csv "dados.csv" ","
Para campos com quebras de linha internas, o csvkit novamente é recomendado, ou pode-se usar awk com lógica de estado:
awk -F',' '
BEGIN {dentro_aspas=0}
{
if (dentro_aspas) {
linha = linha ORS $0
if ($0 ~ /"$/) dentro_aspas=0
} else {
if ($0 ~ /^[^"]*"[^"]*$/) {
linha = $0
dentro_aspas=1
} else {
print $0
}
}
}
END {if (dentro_aspas) print linha}' dados_complexos.csv
Referências
- GNU Coreutils: cut manual — Documentação oficial do comando cut para extração de colunas
- GNU Awk User's Guide — Manual completo do awk, essencial para manipulação de dados tabulares
- csvkit Documentation — Documentação oficial do csvkit, conjunto de ferramentas para CSV complexo
- Command Line Text Processing: column — Tutorial prático sobre o comando column para formatação de tabelas
- Advanced Bash-Scripting Guide: File and Data Manipulation — Guia avançado com exemplos de manipulação de arquivos CSV e TSV em shell script