#365Posts – awk, o utilitário coisa linda do UNIX

Entre as atribuições mais estranhas que meu trabalho possa trazer, hoje tive a necessidade de trabalhar alguns arquivos CSV gigantes (um deles com mais de 1.300.000 registros).

O trabalho consistia em converter os arquivos gerados por um sistema de terceiro para o formato esperado pelo sistema que instalei para meu cliente. O arquivo de origem tinha menos colunas do que o arquivo final deveria ter, e a ordem destas não era compatível com a ordem esperada pelo “meu” sistema.

As colunas que o sistema original informava eram algo como:

  • Estado da conta
  • Data do pedido
  • Número do pedido
  • Email do cliente
  • Nome
  • Sobrenome

Já o “meu” sistema requeria algo como:

  • Nome
  • Sobrenome
  • Email
  • CEP
  • Endereço
  • Bairro
  • Cidade
  • Estado
  • Número do Pedido

A primeira ideia que tive foi de usar um programa de planilha para reordenar as colunas, inserir as colunas em branco que faltavam, filtras as linhas que me interessavam e então salvar o arquivo CSV no formato correto. Na teoria um bom plano. Na prática um plano impossível, porque com mais de 10.000 linhas no CSV a planilha já fica pesada demais, e nenhum programa lê arquivos com mais de um milhão de linhas.

Então resolvi deixar de bobagem e resolvi usar a linha de comando para resolver meu problema em questão de segundos.

Veja:

cat lista-original.csv | grep ACTIVE > lista-ativos.csv
awk < lista-ativos.csv -F, \
  '{print $5 "," $6 "," $4 ",\"\",\"\",\"\",\"\",\"\"," $3}' > \
  lista-final.csv

Na linha 1 do código acima, eu filtro a lista original pela tag ACTIVE que deve estar constando na primeira coluna do CSV original. As linhas 2, 3 e 4 são uma linha só, na verdade, contendo o comando awk que vai fazer a mágica de criar o arquivo final, pronto para importação no “meu” sistema, com as colunas no lugar certo, sem esquecer de incluir as colunas em branco relativas aos valores inexistentes no arquivo original.

O parâmetro -F, informa ao awk que ele deve esperar uma vírgula como separador de valores (em vez de espaços e tabulações, o default).

Em seguida temos um comando print que faz com que cada linha do arquivo de entrada seja gravada no arquivo de saída; $5 indica a quinta coluna do arquivo de entrada, $6 a sexta, e assim por diante. Tomo o cuidado de “imprimir” as vírgulas separando os valores, e forço as colunas em branco com \"\", que é a sequência escapada para duas aspas duplas consecutivas (já que elas estão dentro de uma string que por si só já é delimitada por aspas duplas).

O resultado foi eu processando todas minhas listas gigantes em menos de um minuto, sem a demora e a irritação causada pelas planilhas.

É claro que o código acima pode ser reescrito de maneira mais elegante por um usuário mais tarimbado em awk, mas a mim importa que o problema foi 100% resolvido.

Newsletter

Gostou deste conteúdo? Informe seu email e receba gratuitamente todos os novos posts na sua caixa de entrada (será necessário confirmar a inscrição em seguida, verifique sua caixa postal).

Leia também
Deixe seu comentário

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.