Introducción

Este só será un artigo onde ir recollendo usos e exemplos de AWK, polo que irá mudando con novos contidos co tempo.

Según a Wikipedia: “é unha linguaxe de programación deseñada para procesar datos baseados en texto, xa sexan ficheiros ou fluxos de datos.”

Usos

  1. Completar N díxitos nunha lista de números

    No traballo tiña unha lista de varios centos de códigos enviados por outro departamento. Estes códigos deberon copialos dun Excel, e pegalos no txt que me enviaron. Os códigos tiñan entre tres e cinco díxitos, cando deberían ter oito.

     awk '{printf "%08d\n", $1}' ficheiro_entrada.txt > ficheiro_saida.txt
    
    • Explicación:
      • awk: o commando.
      • printf: permite formatear a saída, igual que en C.
      • %08d: especifica o formato
        • 08: encherá con díxito 0 á esquerda, ata ter un total de 8 díxitos na cadea.
        • d: indica que agarda un número enteiro.
      • \n: engade un salto de liña despois de imprimir cada liña.
      • $1: o primeiro campo de cada liña. AWK divide a liña automáticamente en campos separados por espazos ou tabuladores.
    • Exemplo, o primeiro é o ficheiro de entrada, o segundo sería a saída:
     123
     11234
     4332
    
     00000123
     00011234
     00004332
    
  2. Converter CSV en SQL

    Outro departamento envioume unha lista de productos a actualizar, era unha lista bastante grande. Así que o máis cómodo era transformar esa lista a un conxunto de SQLs. Cada liña do CSV era algo como id;novo valor;outros datos que non me interesan

     awk -F';' '{print "UPDATE taboa t SET campo = \x27"$2"\x27 WHERE id = UUID_TO_BIN(\x27"$1"\x27);"}' entrada.csv > saida.sql
    

    Explicación:

    • -F';': indica que o separador de columnas é o punto e coma
    • \x27: é a comilla simple, para evitar problemas ao estar dentro doutras comillas simples, escapalas non funcionaba correctamente.
  3. Printf

    Cando usamos printf temos a opción de sustituír variables. Por exemplo se queremos ler dun CSV, para transformalo en SQL, como no caso anterior.

     awk -F';' '{printf "UPDATE taboa t SET campo = \x27%d\x27 WHERE id = UUID_TO_BIN(\x27%d\x27);", $2, $1}' entrada.csv > saida.sql
    

    O que hai que ter en conta, en casos coma este, é que se usamos %d estamos a indicar que o valor será númerico. Co que se quixésemos utilizar unha cadea como 00123456, sería mellor usar %s. Doutro xeito perderíamos os ceros iniciais.