Explicação do código awk

3

O código está sendo usado para remover entradas duplicadas do arquivo histroy.txt que contém o histórico da linha de comando.

BEGIN{
      if (data[$0]++ == 0)
         lines[++count] = $0;
     }
END {
     for(i=1; i<count; i++)
         print lines[i];
    }

O que é data no código e por que ele está sendo comparado a 0 ?

    
por A Q 16.11.2017 / 16:01

1 resposta

5

Esta intenção é lembrar da linha uniq na entrada.

como Jeff Schaller apontou, $0 é indefinido no bloco BEGIN .

um código mais correto deve ser

{
      if (data[$0]++ == 0)
         lines[++count] = $0;
     }
END {
     for(i=1; i<count; i++)
         print lines[i];
    }

ou até mesmo

!data[$0]++ { lines[++count] = $0; }
END {
     for(i=1; i<count; i++)
         print lines[i];
    }

Na primeira vez que uma linha aparecer data[$0] será igual a 0 e line[ ] receberá a linha.

Após o teste, data[$0] será analisado ( ++ é uma pós-incremento) e o teste será avaliado como falso para a linha com o mesmo conteúdo.

A declaração END imprime toda a linha em ordem.

veja também Como o awk '! A [$ 0] ++' funciona?

    
por 16.11.2017 / 16:35

Tags