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:
- el primero:
/ *\$[2-9]\.[0-9][0-9] */
obtiene las líneas que tienen un precio de alimento superior a $2 y - 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
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.