AWK, parte III: Variáveis

parte I: O que é e para que serve
parte II: Comandos Básicos
parte III: Variáveis
parte IV: if e Operadores de Comparação
parte V: Operações Aritméticas e Direcionamento da saída
parte VI: Loops(for & while), Funções e Considerações finais



- Variáveis definidas pelo usuário

Não podem começar variáveis por dígitos, elas são caso sensitivo, não devem ter o mesmo nome das variáveis do AWK nem de outros comandos e não precisam ser inicializadas ou declaradas.

Ao  usar pela primeira uma variável, ela é tanto uma string vazia(“”) como 0, mas não é muito bom confiar seu script nesses valores iniciais.

AWK é fracamente tipado, ou seja, você pode atribuir um número a uma variável e sem seguida atribuir uma string, por exemplo.

Ex: salvar como caes2.awk
BEGIN { nomecor="%-15s %20s\n"; printf nomecor, "Nome", "Cor\n"}
             { printf nomecor, $1, $2}

Inicialmente definimos o formato da varável 'nomecor', uma string alinha a esquerda e outra a direita.
Depois vamos imprimir as strings “Nome” e “Cor” nesse formato da 'nomecor'
Depois vamos imprimir, mas com os argumentos $1 e $2, aí o awk imprime linha a linha.

Pra rodar: awk -f caes2.awk caes.txt


- Variáveis internas

- FS
    FS significa "Field Separator" (separador de campo).
    é a variável que armazena o(s) caractere(s) separador(es) de campos.
    Usamos a flag -F, em exemplo anterior, para o caractere separador fosse a vírgula.
    Com a variável FS podemos escolher este caractere.

fs.awk :
BEGIN { FS=”,” }
{ printf “o %s é : %s\n”, $1,$2}

pra executar: awk -f fs.awk caes.txt

Essa variável é particularmente útil pois podemos definir o separador, não precisa ser somente um caractere. É como se você criasse sua própria expressão regular.
Se estivermos usando dados relacionados com valores de dinheiro: 9,99
Nesse caso não é bom usarmos a vírgula como separador, pois estaríamos separando o valor do real dos centavos.
Use espaço mesmo ou #, por exemplo: 1,99#2,99#3,99

A flexibilidade do FS advém do fato de podermos usar expressões regulares para expressar o 'field separator'. Por exemplo:

Para que o FS seja qualquer número de vírgula: FS="[,]+"
Para que o FS seja qualquer número de espaços: FS="[ ]+"
Para que o FS seja qualquer número de vírgula e qualquer número de espaço: FS="[,]+[ ]+"


Façam o teste com 1, 2, 3 e 4 vírgulas e espaços:
echo "1, 2,,  3,,,   4,,,,    " | awk 'BEGIN {FS="[,]+[ ]+"} {print $0}'

o echo que sai é o que é 'liberado' pela condição imposta no awk. Teste com $1, $2...


- NR
NR é uma variável que é automaticamente incrementada(em 1) em cada linha, pelo AWK.
Ele sempre contém o número da atual.

Teste-a:
awk '{print “Linha numero “,NR}' caes.txt

Pra aparecer o número total de linhas temos que fazer com que somente a última linha seja impressa, e isso pode ser feito com o comando END:
awk 'END {print “Total de linhas: ”,NR}' caes.txt

(Sim, eu sei que existe o comando 'wc', mas o que vale mais é a criatividade e se virar com o que se sabe)

Vamos usar a NR pra enumerar dados de um arquivo.
Salve como: coluna.awk

BEGIN { coluna=”%-10s %15s\n”;
         printf coluna, “Nome”, “Cor\n” }
     { printf “%d. “ coluna, NR, $1, $2 }

rode: awk -f coluna.awk caes.txt

Primeiros definimos a variável coluna, que será usad em todas linhas. Inicialmente a string coluna é imprimida com “Nome   Cor”.

Depois, imprimimos o número da linha seguido da string coluna: “%d. “ coluna,
O primeiro argumento, NR, vai pro “%d”, os outros dois, $1 e $2, vão pra variável coluna.
Note que a NR só começa depois do BEGIN.



A seguir, uma tabela-resumo das variáveis internas do AWK, para, caso te interesse, você saber sobre o que pesquisar:


ARGC, ARGV Contém  número e o array dos argumentos passados pela linha de comando
CONVFMT Controla a conversão de números para strings
ENVIRON Array associativo com dados do sistema. O índices são os variáveis das variáveis do sistema
FILENAME Contém o nome do arquivo que o awk está lendo
FNR Número da gravação corrente, do arquiv corrente, que é incrementao pra cada linha lida
FS Já vista no artigo
NF Número de campos na linha de entrada atual
NR Já vista no artigo
RS Entrada do separador; a padrão é \n
OFS Saída do separador de campo (NF)
ORS Saída da RS
PROCINFO Array contendo informações do arquivo, como “gid”, “uid”, “pid” e “version”




Estudando por
Beginning Shell Scripting - Eric Foster-Johnson, John C. Welc, Micah Anderson - Wrox



Nenhum comentário:

Veja também: