Pesquisa de site

Como usar o Awk para filtrar texto ou strings usando ações específicas de padrão


Na terceira parte da série de comandos Awk, daremos uma olhada na filtragem de texto ou strings com base em padrões específicos que um usuário pode definir.

Às vezes, ao filtrar texto, você deseja indicar certas linhas de um arquivo de entrada ou linhas de strings com base em uma determinada condição ou usando um padrão específico que possa ser correspondido. Fazer isso com o Awk é muito fácil, é um dos grandes recursos do Awk que você achará útil.

Vejamos um exemplo abaixo, digamos que você tenha uma lista de compras de alimentos que deseja comprar, chamada food_prices.list. Contém a seguinte lista de alimentos e seus preços.

$ cat food_prices.list 
No	Item_Name		Quantity	Price
1	Mangoes			   10		$2.45
2	Apples			   20		$1.50
3	Bananas			   5		$0.90
4	Pineapples		   10		$3.46
5	Oranges			   10		$0.78
6	Tomatoes		   5		$0.55
7	Onions			   5            $0.45

E então, você deseja indicar um sinal (*) em alimentos cujo preço seja maior que $2, isso pode ser feito executando o seguinte comando:

awk '/ *$[2-9]\.[0-9][0-9] */ { print $1, $2, $3, $4, "*" ; } / *$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list

Na saída acima, você pode ver que há um sinal (*) no final das linhas contendo itens alimentares, mangas e abacaxi . Se você verificar os preços, eles estão acima de $2.

Neste exemplo, usamos dois padrões:

  1. o primeiro: / *\$[2-9]\.[0-9][0-9] */ obtém as linhas cujo preço do alimento é maior que $2 e
  2. a segunda: /*\$[0-1]\.[0-9][0-9] */ procura linhas com preço de alimento inferior a $2 .

É o que acontece, existem quatro campos no arquivo, quando o padrão um encontra uma linha com preço de alimento maior que $2, ele imprime todos os quatro campos e um (*) sinal no final da linha como um sinalizador.

O segundo padrão simplesmente imprime as outras linhas com preços de alimentos menores que $2 conforme aparecem no arquivo de entrada, food_prices.list.

Dessa forma, você pode usar ações específicas do padrão para filtrar itens alimentares com preços acima de $2, embora haja um problema com a saída, as linhas que possuem o (*) O sinal não está formatado como o restante das linhas, tornando a saída não clara o suficiente.

Vimos o mesmo problema na Parte 2 da série awk, mas podemos resolvê-lo de duas maneiras:

1. Usando o comando printf que é uma maneira longa e chata de usar o comando abaixo:

awk '/ *$[2-9]\.[0-9][0-9] */ { printf "%-10s %-10s %-10s %-10s\n", $1, $2, $3, $4 "*" ; } / *$[0-1]\.[0-9][0-9] */ { printf "%-10s %-10s %-10s %-10s\n", $1, $2, $3, $4; }' food_prices.list 

2. Usando o campo $0. Awk usa a variável 0 para armazenar toda a linha de entrada. Isso é útil para resolver o problema acima e é simples e rápido da seguinte forma:

awk '/ *$[2-9]\.[0-9][0-9] */ { print $0 "*" ; } / *$[0-1]\.[0-9][0-9] */ { print ; }' food_prices.list 

Conclusão

Por enquanto é isso e essas são maneiras simples de filtrar texto usando ações específicas de padrão que podem ajudar a sinalizar linhas de texto ou strings em um arquivo usando o comando Awk.

Espero que este artigo seja útil e lembre-se de ler a próxima parte da série, que se concentrará no uso de operadores de comparação com a ferramenta awk.