Recherche de site Web

Comment utiliser Awk pour filtrer du texte ou des chaînes à l'aide d'actions spécifiques à un modèle


Dans la troisième partie de la série de commandes Awk, nous examinerons le filtrage du texte ou des chaînes en fonction de modèles spécifiques qu'un utilisateur peut définir.

Parfois, lors du filtrage de texte, vous souhaitez indiquer certaines lignes d'un fichier d'entrée ou des lignes de chaînes en fonction d'une condition donnée ou en utilisant un modèle spécifique pouvant être mis en correspondance. Faire cela avec Awk est très simple, c'est l'une des fonctionnalités intéressantes de Awk qui vous sera utile.

Jetons un coup d'œil à un exemple ci-dessous. Supposons que vous ayez une liste de courses pour les produits alimentaires que vous souhaitez acheter, appelée food_prices.list. Il contient la liste suivante de produits alimentaires et leurs prix.

$ 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

Et puis, vous souhaitez indiquer un signe (*) sur les produits alimentaires dont le prix est supérieur à $2, cela peut être fait en exécutant la commande suivante :

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

À partir du résultat ci-dessus, vous pouvez voir qu'il y a un signe (*) à la fin des lignes contenant des produits alimentaires, des mangues et des ananas . . Si vous vérifiez leurs prix, ils sont supérieurs à 2$.

Dans cet exemple, nous avons utilisé deux modèles :

  1. le premier : / *\$[2-9]\.[0-9][0-9] */ obtient les lignes dont le prix des produits alimentaires est supérieur à 2 $ et
  2. la seconde : /*\$[0-1]\.[0-9][0-9] */ recherche les lignes dont le prix des produits alimentaires est inférieur à 2 $ .

C'est ce qui se passe, il y a quatre champs dans le fichier, lorsque le modèle 1 rencontre une ligne avec un prix de produit alimentaire supérieur à 2 $, il imprime les quatre champs et un (*) signe en fin de ligne en guise de drapeau.

Le deuxième modèle imprime simplement les autres lignes avec un prix alimentaire inférieur à 2 $ tels qu'ils apparaissent dans le fichier d'entrée, food_prices.list.

De cette façon, vous pouvez utiliser des actions spécifiques à un modèle pour filtrer les produits alimentaires dont le prix est supérieur à 2 $, bien qu'il y ait un problème avec la sortie, les lignes qui ont le (*) le signe n'est pas formaté comme le reste des lignes, ce qui rend la sortie pas assez claire.

Nous avons vu le même problème dans la partie 2 de la série awk, mais nous pouvons le résoudre de deux manières :

1. Utilisation de la commande printf qui est une méthode longue et ennuyeuse en utilisant la commande ci-dessous :

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. Utilisation du champ $0. Awk utilise la variable 0 pour stocker toute la ligne d'entrée. C'est pratique pour résoudre le problème ci-dessus et c'est simple et rapide comme suit :

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

Conclusion

C'est tout pour l'instant et ce sont des moyens simples de filtrer le texte à l'aide d'une action spécifique à un modèle qui peut aider à signaler des lignes de texte ou des chaînes dans un fichier à l'aide de la commande Awk.

J'espère que cet article vous sera utile et n'oubliez pas de lire la prochaine partie de la série qui se concentrera sur l'utilisation des opérateurs de comparaison à l'aide de l'outil awk.