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