#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:

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.

Compartilhe

Glossário
CSV
Comma Separated Value: valores separados por vírgula

Avalie este conteúdo!

Avaliação média: 4.38
Total de Votos: 13
#365Posts – awk, o utilitário coisa linda do UNIX

Janio Sarmento
Administrador de sistemas, humanista, progressista, apreciador de computadores e bugigangas eletrônicas, acredita que os blogs nunca morrerão, por mais que as redes sociais pareçam cada vez mais sedutoras para as grandes massas.

Comente!

This site uses Akismet to reduce spam. Learn how your comment data is processed.