Pesquisa de site

Como usar o comando ‘next’ com Awk no Linux – Parte 6


Nesta sexta parte da série Awk, veremos como usar o comando next, que diz ao Awk para pular todos os padrões e expressões restantes que você forneceu, mas em vez disso leia o próximo linha de entrada.

O comando next ajuda a evitar a execução do que eu chamaria de etapas demoradas na execução de um comando.

Para entender como funciona, vamos considerar um arquivo chamado food_list.txt que se parece com isto:

No      Item_Name               Price           Quantity
1       Mangoes                 $3.45              5
2       Apples                  $2.45              25
3       Pineapples              $4.45              55
4       Tomatoes                $3.45              25
5       Onions                  $1.45              15
6       Bananas                 $3.45              30

Considere executar o seguinte comando que sinalizará itens alimentares cuja quantidade seja menor ou igual a 20 com um sinal (*) no final de cada linha:

# awk '$4 <= 20 { printf "%s\t%s\n", $0,"*" ; } $4 > 20 { print $0 ;} ' food_list.txt 

No	Item_Name		Price		Quantity
1	Mangoes			$3.45		   5	*
2	Apples			$2.45              25
3	Pineapples		$4.45              55
4	Tomatoes		$3.45              25 
5	Onions			$1.45              15	*
6	Bananas	                $3.45              30

O comando acima realmente funciona da seguinte maneira:

  1. Primeiro, verifica se a quantidade, quarto campo de cada linha de entrada, é menor ou igual a 20, se um valor atende a essa condição, ele é impresso e sinalizado com o (*) sinal no final usando a expressão um: $4 <= 20
  2. Em segundo lugar, verifica se o quarto campo de cada linha de entrada é maior que 20 e, se uma linha atende à condição, ela é impressa usando a expressão dois: $4 > 20

Mas há um problema aqui, quando a primeira expressão é executada, uma linha que queremos sinalizar é impressa usando: { printf "%s\t%s\n", $0, "**"; } e, na mesma etapa, a segunda expressão também é verificada, o que se torna um fator de perda de tempo.

Portanto, não há necessidade de executar a segunda expressão, $4 > 20 novamente após imprimir as linhas já sinalizadas que foram impressas usando a primeira expressão.

Para lidar com este problema, você deve usar o comando next da seguinte forma:

# awk '$4 <= 20 { printf "%s\t%s\n", $0,"*" ; next; } $4 > 20 { print $0 ;} ' food_list.txt

No	Item_Name		Price		Quantity
1	Mangoes			$3.45		   5	*
2	Apples			$2.45              25
3	Pineapples		$4.45              55
4	Tomatoes		$3.45              25 
5	Onions			$1.45              15	*
6	Bananas	                $3.45              30

Depois que uma única linha de entrada é impressa usando $4 <= 20 { printf "%s\t%s\n", $0,"*" ; próximo ; }, o comando next incluído ajudará a pular a segunda expressão $4 > 20 { print $0 ;}, então a execução vai para a próxima linha de entrada sem perder tempo verificando se a quantidade é maior que 20.

O comando next é muito importante para escrever comandos eficientes e quando necessário, você sempre pode usar para acelerar a execução de um script. Prepare-se para a próxima parte da série, onde veremos o uso da entrada padrão (STDIN) como entrada para Awk.

Espero que este guia seja útil e, como sempre, você possa expressar suas idéias por escrito, deixando um comentário na seção de comentários abaixo.