Pesquisa de site

Como usar instruções de controle de fluxo no Awk - Parte 12


Ao revisar todos os exemplos do Awk que cobrimos até agora, desde o início da série Awk, você notará que todos os comandos nos vários exemplos são executados sequencialmente, ou seja, um após o outro. Mas em certas situações, podemos querer executar algumas operações de filtragem de texto com base em algumas condições, é aí que entra a abordagem das instruções de controle de fluxo.

Existem várias instruções de controle de fluxo na programação Awk e incluem:

  1. instrução if-else
  2. para declaração
  3. instrução while
  4. instrução do-while
  5. declaração de interrupção
  6. continuar declaração
  7. próxima declaração
  8. declaração do próximo arquivo
  9. declaração de saída

Porém, para o escopo desta série, iremos expor sobre: if-else, for, while e do while instruções. Lembre-se de que já explicamos como usar a próxima instrução na Parte 6 desta série Awk.

1. A declaração if-else

A sintaxe esperada da instrução if é semelhante à da instrução if do shell:

if  (condition1) {
     actions1
}
else {
      actions2
}

Na sintaxe acima, condition1 e condition2 são expressões Awk, e actions1 e actions2 são comandos Awk executados quando o respectivas condições sejam satisfeitas.

Quando a condição1 é satisfeita, o que significa que é verdadeira, então ações1 é executada e a instrução if é encerrada, caso contrário, ações2 é executado.

A instrução if também pode ser expandida para uma instrução if-else_if-else conforme abaixo:

if (condition1){
     actions1
}
else if (conditions2){
      actions2
}
else{
     actions3
}

Para o formulário acima, se condição1 for verdadeira, então ações1 será executada e a instrução if será encerrada, caso contrário, condição2 é avaliado e se for verdadeiro, então actions2 é executado e a instrução if é encerrada. No entanto, quando condição2 é falsa, então, ações3 é executada e a instrução if é encerrada.

Aqui está um caso de uso de instruções if, temos uma lista de usuários e suas idades armazenadas no arquivo, usuários .txt.

Queremos imprimir uma declaração indicando o nome de um usuário e se a idade do usuário é menor ou maior que 25 anos.

aaronkilik@tecMint ~ $ cat users.txt
Sarah L			35    	F
Aaron Kili		40    	M
John  Doo		20    	M
Kili  Seth		49    	M    

Podemos escrever um pequeno script de shell para realizar nosso trabalho acima. Aqui está o conteúdo do script:


#!/bin/bash
awk ' { 
        if ( $3 <= 25 ){
           print "User",$1,$2,"is less than 25 years old." ;
        }
        else {
           print "User",$1,$2,"is more than 25 years old" ; 
}
}'    ~/users.txt

Em seguida, salve o arquivo e saia, torne o script executável e execute-o da seguinte maneira:

chmod +x test.sh
./test.sh
Saída de amostra
User Sarah L is more than 25 years old
User Aaron Kili is more than 25 years old
User John Doo is less than 25 years old.
User Kili Seth is more than 25 years old

2. A declaração for

Caso você queira executar alguns comandos do Awk em um loop, então a instrução for oferece uma maneira adequada de fazer isso, com a sintaxe abaixo:

Aqui, a abordagem é simplesmente definida pelo uso de um contador para controlar a execução do loop, primeiro você precisa inicializar o contador, depois executá-lo contra uma condição de teste, se for verdade, executar as ações e finalmente incrementar o contador. O loop termina quando o contador não satisfaz a condição.

for ( counter-initialization; test-condition; counter-increment ){
      actions
}

O seguinte comando Awk mostra como funciona a instrução for, onde queremos imprimir os números 0-10:

awk 'BEGIN{ for(counter=0;counter<=10;counter++){ print counter} }'
Saída de amostra
0
1
2
3
4
5
6
7
8
9
10

3. A declaração while

A sintaxe convencional da instrução while é a seguinte:

while ( condition ) {
          actions
}

A condição é uma expressão do Awk e as ações são linhas de comandos do Awk executadas quando a condição é verdadeira.

Abaixo está um script para ilustrar o uso da instrução while para imprimir os números 0-10:

#!/bin/bash
awk ' BEGIN{ counter=0 ;
         
        while(counter<=10){
              print counter;
              counter+=1 ;
             
}
}  

Salve o arquivo e torne o script executável e execute-o:

chmod +x test.sh
./test.sh
Saída de amostra
0
1
2
3
4
5
6
7
8
9
10

4. A declaração do while

É uma modificação da instrução while acima, com a seguinte sintaxe subjacente:

do {
     actions
}
 while (condition) 

A pequena diferença é que, em do while, os comandos do Awk são executados antes da condição ser avaliada. Usando o mesmo exemplo da instrução while acima, podemos ilustrar o uso de do while alterando o comando Awk no script test.sh como segue:

#!/bin/bash

awk ' BEGIN{ counter=0 ;  
        do{
            print counter;  
            counter+=1 ;    
        }
        while (counter<=10)   
} 
'

Após modificar o script, salve o arquivo e saia. Em seguida, torne o script executável e execute-o da seguinte maneira:

chmod +x test.sh
./test.sh
Saída de amostra
0
1
2
3
4
5
6
7
8
9
10

Conclusão

Este não é um guia completo sobre instruções de controle de fluxo do Awk, como mencionei anteriormente, existem várias outras declarações de controle de fluxo no Awk.

No entanto, esta parte da série Awk deve lhe dar uma ideia clara e fundamental de como a execução dos comandos do Awk pode ser controlada com base em certas condições.

Você também pode expor mais sobre o restante das instruções de controle de fluxo para obter mais compreensão sobre o assunto. Finalmente, na próxima seção da série Awk, passaremos a escrever scripts Awk.