Búsqueda de sitios web

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


En la tercera parte de la serie de comandos Awk, veremos cómo filtrar texto o cadenas según 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 excelentes funciones de Awk que le resultará útil.

Echemos un vistazo a un ejemplo a continuación, supongamos 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 que tienen alimentos, mangos y piñas . . Si miras sus precios, están por encima de los $2.

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 alimento superior a $2 y
  2. el segundo: /*\$[0-1]\.[0-9][0-9] */ busca líneas con precios de alimentos inferiores 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 superior a $2, imprime los cuatro campos y un (*) signo al final de la línea como bandera.

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

De esta manera, puede utilizar 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 (*) sign no está formateado como el resto de las líneas, lo que hace que el resultado no sea lo suficientemente claro.

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

1. Usar el comando printf, que es una forma larga y aburrida de usar 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 sencillas de filtrar texto usando acciones específicas de patrón que pueden 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.