CLI AI

Imprimir uma coluna de um CSV com awk (e quando não usar)

2026-05-06

awk -F, '{print $2}' file.csv extrai uma coluna em uma linha, e para um CSV gerado por máquina a história termina aí. Para um CSV que veio de uma planilha existe uma armadilha que produz números errados em vez de erros — por isso vale saber onde fica o limite.

1. Uma coluna

clai
$ clai imprime a primeira coluna de data.csv→ awk -F, '{print $1}' data.csvnameAliceBob

-F, define o separador de campos. Os campos são $1, $2, … e $0 é a linha inteira.

2. Várias colunas, pulando o cabeçalho

clai
$ clai imprime as colunas 1 e 3 de data.csv sem a linha de cabeçalho→ awk -F, 'NR>1 {print $1, $3}' data.csvAlice 100Bob 250

NR>1 pula a primeira linha. NR é o número do registro, e usá-lo como condição é como o awk expressa «para as linhas onde…».

3. Manter separado por vírgulas na saída

clai
$ clai extrai as colunas 1 e 3 como csv válido→ awk -F, 'BEGIN{OFS=","} NR>1 {print $1,$3}' data.csvAlice,100Bob,250

print $1, $3 une os campos com OFS, que por padrão é um espaço. Defina-o em BEGIN e a saída volta a ser CSV.

4. Somar uma coluna

clai
$ clai soma a terceira coluna de data.csv→ awk -F, 'NR>1 {s+=$3} END {print "total", s}' data.csvtotal 350

Sem declarar variável, sem inicializar — no awk os números começam em zero. END roda uma vez, depois da última linha.

5. Filtrar linhas e depois pegar uma coluna

clai
$ clai mostra os nomes onde o valor é maior que 200→ awk -F, 'NR>1 && $3 > 200 {print $1}' data.csvBob

É aqui que o awk vence a planilha: o mesmo one-liner percorre um arquivo de 3 GB sem precisar abri-lo.

6. A armadilha: uma vírgula dentro de um campo entre aspas

clai
$ clai imprime a segunda coluna→ awk -F, 'NR>1 {print $2}' data.csvBerlin"Paris

A linha Bob,"Paris, France",250 tem três campos lógicos, mas quatro vírgulas. O awk não sabe nada sobre aspas, então $2 vira "Paris, $3 vira France", e a soma do passo 4 devolve silenciosamente 100 em vez de 350. Não dá erro — só te dá o número errado.

Pegadinhas

  • Verifique se há aspas antes de confiar em um total. grep -c '"' file.csv — se for zero, o awk simples é seguro. Se não for, use um parser de CSV de verdade: csvcut -c 1,3 data.csv (csvkit), mlr --csv cut -f name,amount (Miller), ou três linhas de Python.
  • -F, não é o mesmo que -F', '. Um separador de vírgula-mais-espaço produz campos vazios silenciosamente em linhas sem esse espaço.
  • Quebras de linha do Windows deixam um \r no último campo. $NF deixa de bater sem nenhum motivo visível. Corrige-se com awk -F, '{gsub(/\r$/,"")} …' ou rodando dos2unix antes.

Perguntas relacionadas

Como imprimo a última coluna? awk -F, '{print $NF}'. NF é o número de campos, então $NF é o último e $(NF-1) o anterior.

Como uso um separador de tabulação? awk -F'\t' — entre aspas para o shell não engolir a barra invertida.

O awk é mais rápido que o pandas pra isso? Para extrair ou somar uma coluna de um arquivo grande, sim, e muito — ele processa em streaming e nunca monta uma estrutura de dados. Para joins ou reestruturação, use pandas.

Veja também

Descreva a extração que você quer; o CliAI escreve o programa awk, incluindo o BEGIN{OFS=","} que você esqueceria. Instale em uma linha.