Cómo utilizar Awk para filtrar texto o cadenas mediante acciones específicas de patrón


En la tercera parte de la serie de comandos Awk, veremos el filtrado de texto o cadenas en función de patrones específicos que un usuario puede definir.

A veces, al filtrar texto, desea indicar ciertas líneas de un archivo de entrada o líneas de cadenas en función de una condición determinada o utilizando un patrón específico que pueda coincidir. Hacer esto con Awk es muy fácil, es una de las grandes características de Awk que le resultará útil.

Echemos un vistazo a un ejemplo a continuación, digamos que tiene una lista de compras de alimentos que desea comprar, llamada food_prices.list. Tiene la siguiente lista de alimentos y sus precios.

$ 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

Y luego, desea indicar un signo (*) en los alimentos cuyo precio es mayor que $2 , esto se puede hacer ejecutando el siguiente comando:

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

En el resultado anterior, puede ver que hay un signo (*) al final de las líneas con alimentos, mangos y piñas. Si consulta sus precios, están por encima de los 2 dólares.

En este ejemplo, hemos utilizado dos patrones:

  1. el primero: /*\$[2-9] \. [0-9] [0-9] */ obtiene las líneas que tienen un precio de artículo alimenticio superior a $2 y
  2. el segundo: /*\$[0-1]\.[0-9][0-9] */ busca líneas con un precio de alimento menor a $2.

Esto es lo que sucede, hay cuatro campos en el archivo, cuando el patrón uno encuentra una línea con un precio de artículo alimenticio mayor a $2, imprime los cuatro campos y un signo (*) al final de la línea como una bandera.

El segundo patrón simplemente imprime las otras líneas con el precio de los alimentos menor a $2 como aparecen en el archivo de entrada, food_prices.list.

De esta manera, puede usar acciones específicas de patrón para filtrar los alimentos que tienen un precio superior a $2, aunque hay un problema con la salida, las líneas que tienen el signo (*) no tienen el formato el resto de las líneas hacen que la salida no sea lo suficientemente clara.

Vimos el mismo problema en la Parte 2 de la serie awk, pero podemos resolverlo de dos maneras:

1. Usando el comando printf, que es una forma larga y aburrida usando el siguiente comando:

$ 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 el campo $0. Awk usa la variable 0 para almacenar toda la línea de entrada. Esto es útil para resolver el problema anterior y es simple y rápido de la siguiente manera:

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

Conclusión

Eso es todo por ahora y estas son formas simples de filtrar texto usando una acción específica de patrón que puede ayudar a marcar líneas de texto o cadenas en un archivo usando el comando Awk.

Espero que este artículo le resulte útil y recuerde leer la siguiente parte de la serie, que se centrará en el uso de operadores de comparación con la herramienta awk.