2019-03-03 01:48:17 +03:00
|
|
|
|
---
|
2019-03-08 19:18:42 +03:00
|
|
|
|
category: tool
|
|
|
|
|
tool: awk
|
2019-03-03 01:48:17 +03:00
|
|
|
|
filename: learnawk-fr.awk
|
|
|
|
|
contributors:
|
|
|
|
|
- ["Marshall Mason", "http://github.com/marshallmason"]
|
|
|
|
|
translators:
|
|
|
|
|
- ["GannonTdW", "https://github.com/GannonTdW"]
|
|
|
|
|
lang: fr-fr
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
2022-07-11 15:46:32 +03:00
|
|
|
|
AWK est un outil standard présent dans chaque système UNIX conforme aux normes
|
|
|
|
|
POSIX. C’est un outil en ligne de commande qui ressemble au Perl et qui est
|
|
|
|
|
excellent dans les tâches de traitement de fichiers texte.
|
|
|
|
|
Vous pouvez l’appeler à partir d’un script shell, ou l’utiliser comme un langage
|
|
|
|
|
de script autonome.
|
2019-03-03 01:48:17 +03:00
|
|
|
|
|
|
|
|
|
Pourquoi utiliser AWK au lieu du langage Perl ?
|
2022-07-11 15:46:32 +03:00
|
|
|
|
Principalement, car AWK fait partie d'UNIX et est donc présent par défaut sur
|
|
|
|
|
une très grande partie des systèmes d'exploitation UNIX et Linux.
|
|
|
|
|
AWK est aussi plus facile à lire que le langage Perl ; et est l'outil idéal pour
|
|
|
|
|
ce qui concerne le traitement de texte simple. Notamment le traitement de ceux
|
|
|
|
|
qui nécessitent de lire des fichiers ligne par ligne ; chaque ligne comportant
|
|
|
|
|
des champs séparés par des délimiteur.
|
2019-03-03 01:48:17 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```awk
|
|
|
|
|
#!/usr/bin/awk -f
|
|
|
|
|
|
|
|
|
|
# Les commentaires commencent par un #
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# les programmes AWK consistent en une collection de règles et d'actions
|
|
|
|
|
règle1 { action; }
|
|
|
|
|
règle2 { action; }
|
|
|
|
|
|
|
|
|
|
# AWK lit et analyse automatiquement chaque ligne de chaque fichier fourni.
|
2022-07-11 15:46:32 +03:00
|
|
|
|
# Chaque ligne est divisée par un délimiteur FS qui est par défaut l'espace
|
|
|
|
|
# (plusieurs espaces ou une tabulation comptent pour un espace). Ce délimiteur
|
2022-07-12 14:32:27 +03:00
|
|
|
|
# peut être changé grâce à l'option -F ou être renseigné au début d'un bloc
|
2022-07-11 15:46:32 +03:00
|
|
|
|
# (exemple: FS = " ").
|
|
|
|
|
|
|
|
|
|
# BEGIN est une règle spécifique exécutée au début du programme. C'est à cet
|
|
|
|
|
# endroit que vous mettrez tout le code à exécuter avant de traiter les fichiers
|
|
|
|
|
# texte. Si vous ne disposez pas de fichiers texte, considérez BEGIN comme le
|
|
|
|
|
# point d’entrée principal du script.
|
2022-07-12 14:32:27 +03:00
|
|
|
|
# À l'opposé de BEGIN, il existe la règle END. Cette règle est présente après
|
2022-07-11 15:46:32 +03:00
|
|
|
|
#chaque fin de fichier (EOF : End Of File).
|
2019-03-03 01:48:17 +03:00
|
|
|
|
|
|
|
|
|
BEGIN {
|
|
|
|
|
|
|
|
|
|
# Les variables sont globales. Pas besoin de les déclarer.
|
|
|
|
|
count = 0;
|
|
|
|
|
|
2022-11-23 23:17:18 +03:00
|
|
|
|
# les opérateurs sont identiques au langage C et aux langages similaires
|
2022-07-12 14:32:27 +03:00
|
|
|
|
# (tels que C#, C++, etc.)
|
2019-03-03 01:48:17 +03:00
|
|
|
|
a = count + 1; # addition
|
|
|
|
|
b = count - 1; # soustraction
|
|
|
|
|
c = count * 1; # multiplication
|
|
|
|
|
d = count / 1; # division entière
|
|
|
|
|
e = count % 1; # modulo, reste de la division entière
|
|
|
|
|
f = count ^ 1; # exponentiel
|
|
|
|
|
|
|
|
|
|
a += 1;
|
|
|
|
|
b -= 1;
|
|
|
|
|
c *= 1;
|
|
|
|
|
d /= 1;
|
|
|
|
|
e %= 1;
|
|
|
|
|
f ^= 1;
|
|
|
|
|
|
|
|
|
|
# Incrémenter et décrémenter par un
|
|
|
|
|
a++;
|
|
|
|
|
b--;
|
|
|
|
|
|
2022-11-23 23:26:20 +03:00
|
|
|
|
# En tant qu'opérateur préfixé, c'est la valeur incrémentée qui
|
|
|
|
|
# est retournée
|
2019-03-03 01:48:17 +03:00
|
|
|
|
++a;
|
|
|
|
|
--b;
|
|
|
|
|
|
|
|
|
|
# Instruction de contrôle
|
|
|
|
|
if (conteur == 0)
|
|
|
|
|
print "Nombre de départ 0";
|
|
|
|
|
else
|
|
|
|
|
print "Hein?";
|
|
|
|
|
|
|
|
|
|
# Vous pouvez aussi utiliser l'opérateur ternaire
|
|
|
|
|
print (compteur == 0) ? "Nombre de départ 0" : "Hein?";
|
|
|
|
|
|
|
|
|
|
# Les blocs sont composés d'une multitude de lignes entre accolades
|
|
|
|
|
while (a < 10) {
|
2022-07-11 15:46:32 +03:00
|
|
|
|
print "La concaténation de chaînes de caractères" " se fait avec"
|
|
|
|
|
"des séries de chaînes " "séparées par des espaces";
|
2019-03-03 01:48:17 +03:00
|
|
|
|
print a;
|
|
|
|
|
|
|
|
|
|
a++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < 10; i++)
|
|
|
|
|
print "le bon vieux for pour les boucles";
|
|
|
|
|
|
|
|
|
|
# Les opérateurs de comparaison sont standard
|
|
|
|
|
# a < b # plus petit que
|
|
|
|
|
# a <= b # plus petit ou égale à
|
|
|
|
|
# a != b # non égale
|
|
|
|
|
# a == b # égale
|
|
|
|
|
# a > b # Plus grand que
|
|
|
|
|
# a >= b # Plus grand ou égale à
|
|
|
|
|
|
|
|
|
|
# Les opérateurs logiques sont
|
|
|
|
|
# a && b # ET
|
|
|
|
|
# a || b # OU
|
|
|
|
|
|
|
|
|
|
# En plus, il y a les expressions régulières
|
|
|
|
|
if ("foo" ~ "^fo+$")
|
|
|
|
|
print "Fooey!";
|
|
|
|
|
if ("boo" !~ "^fo+$")
|
|
|
|
|
print "Boo!";
|
|
|
|
|
|
|
|
|
|
# Les Tableaux
|
|
|
|
|
arr[0] = "foo";
|
|
|
|
|
arr[1] = "bar";
|
|
|
|
|
|
|
|
|
|
# Vous pouvez aussi initialiser un tableau avec la fonction split()
|
|
|
|
|
|
|
|
|
|
n = split("foo:bar:baz", arr, ":");
|
|
|
|
|
|
|
|
|
|
# Il y a aussi les tableaux associatifs
|
|
|
|
|
assoc["foo"] = "bar";
|
|
|
|
|
assoc["bar"] = "baz";
|
|
|
|
|
|
2022-07-12 14:32:27 +03:00
|
|
|
|
# et les tableaux multi-dimensions, avec certaines limitations que l'on ne
|
2022-07-11 15:46:32 +03:00
|
|
|
|
# mentionnera pas ici
|
|
|
|
|
|
2019-03-03 01:48:17 +03:00
|
|
|
|
multidim[0,0] = "foo";
|
|
|
|
|
multidim[0,1] = "bar";
|
|
|
|
|
multidim[1,0] = "baz";
|
|
|
|
|
multidim[1,1] = "boo";
|
|
|
|
|
|
|
|
|
|
# Vous pouvez tester l'appartenance à un tableau
|
|
|
|
|
if ("foo" in assoc)
|
|
|
|
|
print "Fooey!";
|
|
|
|
|
|
2022-07-12 14:32:27 +03:00
|
|
|
|
# Vous pouvez aussi utilisez l'opérateur 'in' pour parcourir les clés
|
|
|
|
|
# d'un tableau
|
2019-03-03 01:48:17 +03:00
|
|
|
|
for (key in assoc)
|
|
|
|
|
print assoc[key];
|
|
|
|
|
|
|
|
|
|
# La ligne de commande est dans un tableau spécifique appelé ARGV
|
|
|
|
|
for (argnum in ARGV)
|
|
|
|
|
print ARGV[argnum];
|
|
|
|
|
|
|
|
|
|
# Vous pouvez supprimer des éléments d'un tableau
|
2022-07-11 15:46:32 +03:00
|
|
|
|
# C'est utile pour empêcher AWK de supposer que certains arguments soient
|
|
|
|
|
# des fichiers à traiter.
|
|
|
|
|
|
2019-03-03 01:48:17 +03:00
|
|
|
|
delete ARGV[1];
|
|
|
|
|
|
2022-11-23 23:26:20 +03:00
|
|
|
|
# Le nombre d'arguments de la ligne de commande est assigné à
|
|
|
|
|
# la variable ARGC
|
2019-03-03 01:48:17 +03:00
|
|
|
|
print ARGC;
|
|
|
|
|
|
|
|
|
|
# AWK inclue trois catégories de fonction.
|
|
|
|
|
# On les examinera plus tard
|
|
|
|
|
|
|
|
|
|
return_value = arithmetic_functions(a, b, c);
|
|
|
|
|
string_functions();
|
|
|
|
|
io_functions();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Voici comment définir une fonction
|
|
|
|
|
function arithmetic_functions(a, b, c, d) {
|
|
|
|
|
|
2022-07-12 14:32:27 +03:00
|
|
|
|
# La partie la plus ennuyeuse de AWK est probablement l’absence de variables
|
2022-07-11 15:46:32 +03:00
|
|
|
|
# locales. Tout est global. Pour les scripts courts, c'est très utile, mais
|
2022-07-12 14:32:27 +03:00
|
|
|
|
# pour les scripts plus longs, cela peut poser un problème.
|
2019-03-03 01:48:17 +03:00
|
|
|
|
|
2022-07-12 14:32:27 +03:00
|
|
|
|
# Il y a cependant une solution de contournement (enfin ... une bidouille).
|
2019-03-03 01:48:17 +03:00
|
|
|
|
# Les arguments d'une fonction sont locaux à cette fonction.
|
2022-11-23 23:26:20 +03:00
|
|
|
|
# Et AWK vous permet de définir plus d'arguments à la fonction que
|
|
|
|
|
# nécessaire. Il suffit donc de mettre une variable locale dans la
|
|
|
|
|
# déclaration de fonction, comme ci-dessus. La convention veut que vous
|
|
|
|
|
# mettiez quelques espaces supplémentaires pour faire la distinction entre
|
|
|
|
|
# les paramètres réels et les variables locales.
|
2019-03-03 01:48:17 +03:00
|
|
|
|
# Dans cet exemple, a, b et c sont des paramètres réels,
|
|
|
|
|
# alors que d est simplement une variable locale.
|
|
|
|
|
|
|
|
|
|
# Maintenant, les fonctions arithmétiques
|
|
|
|
|
|
2022-07-12 14:32:27 +03:00
|
|
|
|
# La plupart des implémentations de AWK ont des fonctions trigonométriques
|
|
|
|
|
# standards
|
2019-03-03 01:48:17 +03:00
|
|
|
|
localvar = sin(a);
|
|
|
|
|
localvar = cos(a);
|
|
|
|
|
localvar = atan2(b, a); # arc tangente de b / a
|
|
|
|
|
|
|
|
|
|
# Les exponentiels et logarithmes décimaux sont aussi là
|
|
|
|
|
localvar = exp(a);
|
|
|
|
|
localvar = log(a);
|
|
|
|
|
|
|
|
|
|
# Les racines carrées
|
|
|
|
|
localvar = sqrt(a);
|
|
|
|
|
|
|
|
|
|
# Tronquer un nombre décimal en nombre entier
|
|
|
|
|
localvar = int(5.34); # localvar => 5
|
|
|
|
|
|
|
|
|
|
# Les nombres aléatoires
|
2022-07-11 15:46:32 +03:00
|
|
|
|
srand();
|
2019-03-03 01:48:17 +03:00
|
|
|
|
# L'argument de la fonction srand() est la valeur de départ pour générer
|
|
|
|
|
# les nombres aléatoires . Par défaut, il utilise l'heure du système
|
2022-07-11 15:46:32 +03:00
|
|
|
|
|
2019-03-03 01:48:17 +03:00
|
|
|
|
localvar = rand(); # Nombre aléatoire entre 0 et 1.
|
|
|
|
|
|
|
|
|
|
# Maintenant on retourne la valeur
|
|
|
|
|
return localvar;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function string_functions( localvar, arr) {
|
|
|
|
|
|
|
|
|
|
# AWK a plusieurs fonctions pour le traitement des chaînes de caractères,
|
|
|
|
|
# dont beaucoup reposent sur des expressions régulières.
|
|
|
|
|
|
2022-07-12 14:32:27 +03:00
|
|
|
|
# Chercher et remplacer, la première occurrence (sub) ou toutes les
|
|
|
|
|
# occurrences (gsub)
|
2019-03-03 01:48:17 +03:00
|
|
|
|
# Les deux renvoient le nombre de correspondances remplacées
|
2022-07-11 15:46:32 +03:00
|
|
|
|
|
2019-03-03 01:48:17 +03:00
|
|
|
|
localvar = "fooooobar";
|
|
|
|
|
sub("fo+", "Meet me at the ", localvar); # localvar => "Meet me at the bar"
|
2022-07-11 15:12:16 +03:00
|
|
|
|
gsub("e", ".", localvar); # localvar => "m..t m. at th. bar"
|
2019-03-03 01:48:17 +03:00
|
|
|
|
|
2022-11-23 23:26:20 +03:00
|
|
|
|
# Rechercher une chaîne de caractères qui correspond à une expression
|
|
|
|
|
# régulière index() fait la même chose, mais n'autorise pas les expressions
|
|
|
|
|
# régulières
|
2019-03-03 01:48:17 +03:00
|
|
|
|
match(localvar, "t"); # => 4, puisque 't' est le quatrième caractère
|
|
|
|
|
|
|
|
|
|
# Séparer par un délimiteur
|
2022-11-23 23:26:20 +03:00
|
|
|
|
n = split("foo-bar-baz", arr, "-");
|
|
|
|
|
# résultat : a[1] = "foo"; a[2] = "bar"; a[3] = "baz"; n = 3
|
2019-03-03 01:48:17 +03:00
|
|
|
|
|
|
|
|
|
# Autre astuces utiles
|
|
|
|
|
sprintf("%s %d %d %d", "Testing", 1, 2, 3); # => "Testing 1 2 3"
|
|
|
|
|
substr("foobar", 2, 3); # => "oob"
|
|
|
|
|
substr("foobar", 4); # => "bar"
|
|
|
|
|
length("foo"); # => 3
|
|
|
|
|
tolower("FOO"); # => "foo"
|
|
|
|
|
toupper("foo"); # => "FOO"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function io_functions( localvar) {
|
|
|
|
|
|
|
|
|
|
# Vous avez déjà vu print
|
|
|
|
|
print "Hello world";
|
|
|
|
|
|
|
|
|
|
# Mais il y a aussi printf
|
|
|
|
|
printf("%s %d %d %d\n", "Testing", 1, 2, 3);
|
|
|
|
|
|
|
|
|
|
# AWK n'a pas de descripteur de fichier en soi. Il ouvrira automatiquement
|
2022-07-12 14:32:27 +03:00
|
|
|
|
# un descripteur de fichier lorsque vous utilisez quelque chose qui en a
|
|
|
|
|
# besoin.
|
2019-03-03 01:48:17 +03:00
|
|
|
|
# La chaîne de caractères que vous avez utilisée pour cela peut être traitée
|
|
|
|
|
# comme un descripteur de fichier à des fins d'entrée / sortie.
|
|
|
|
|
|
|
|
|
|
outfile = "/tmp/foobar.txt";
|
|
|
|
|
|
|
|
|
|
print "foobar" > outfile;
|
|
|
|
|
|
2022-11-23 23:26:20 +03:00
|
|
|
|
# Maintenant, la chaîne de caractères "outfile" est un descripteur de
|
|
|
|
|
# fichier. Vous pouvez le fermer
|
2019-03-03 01:48:17 +03:00
|
|
|
|
close(outfile);
|
|
|
|
|
|
|
|
|
|
# Voici comment exécuter quelque chose dans le shell
|
|
|
|
|
system("echo foobar"); # => affiche foobar
|
|
|
|
|
|
2022-11-23 23:26:20 +03:00
|
|
|
|
# Lire quelque chose depuis l'entrée standard et la stocker dans une
|
|
|
|
|
# variable locale
|
2019-03-03 01:48:17 +03:00
|
|
|
|
getline localvar;
|
|
|
|
|
|
2022-07-11 15:46:32 +03:00
|
|
|
|
# Lire quelque chose à partir d'un pipe (encore une fois, utilisez une
|
2022-07-12 14:32:27 +03:00
|
|
|
|
# chaîne de caractère que vous fermerez proprement)
|
2019-03-03 01:48:17 +03:00
|
|
|
|
"echo foobar" | getline localvar # localvar => "foobar"
|
|
|
|
|
close("echo foobar")
|
|
|
|
|
|
|
|
|
|
# Lire une ligne d'un fichier et la stocker dans une variable locale
|
|
|
|
|
infile = "/tmp/foobar.txt";
|
|
|
|
|
getline localvar < infile;
|
|
|
|
|
close(infile);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Comme dit au début, AWK consiste en une collection de règles et d'actions.
|
2022-07-11 15:46:32 +03:00
|
|
|
|
# Vous connaissez déjà les règles BEGIN et END. Les autres règles ne sont
|
|
|
|
|
# utilisées que si vous traitez des lignes à partir de fichiers ou l'entrée
|
|
|
|
|
# standard (stdin).
|
|
|
|
|
# Quand vous passez des arguments à AWK, ils sont considérés comme des noms de
|
2022-07-12 14:32:27 +03:00
|
|
|
|
# fichiers à traiter. AWK les traitera tous dans l'ordre. Voyez les comme dans
|
2022-07-11 15:46:32 +03:00
|
|
|
|
# une boucle implicite, parcourant les lignes de ces fichiers. Ces règles et ces
|
|
|
|
|
# actions ressemblent à des instructions switch dans la boucle.
|
2019-03-03 01:48:17 +03:00
|
|
|
|
|
|
|
|
|
/^fo+bar$/ {
|
|
|
|
|
|
2022-07-11 15:46:32 +03:00
|
|
|
|
# Cette action sera exécutée pour chaque ligne qui correspond à l'expression
|
|
|
|
|
# régulière, /^fo+bar$/, et sera ignorée pour toute ligne qui n'y correspond
|
|
|
|
|
# pas. Imprimons simplement la ligne:
|
2019-03-03 01:48:17 +03:00
|
|
|
|
|
|
|
|
|
print;
|
|
|
|
|
|
|
|
|
|
# Pas d'argument ! C'est parce que print a un défaut : $0.
|
2022-11-23 23:26:20 +03:00
|
|
|
|
# $0 est le nom de la ligne en cours de traitement. Il est créé
|
|
|
|
|
# automatiquement.
|
2019-03-03 01:48:17 +03:00
|
|
|
|
|
|
|
|
|
# Vous devinez probablement qu'il existe d'autres variables $.
|
2022-11-23 23:26:20 +03:00
|
|
|
|
# Chaque ligne est divisée implicitement avant que chaque action soit
|
|
|
|
|
# exécutée, comme le fait le shell. Et, comme le shell, chaque champ est
|
|
|
|
|
# accessible avec un signe dollar.
|
2019-03-03 01:48:17 +03:00
|
|
|
|
|
|
|
|
|
# Ceci affichera les deuxième et quatrième champs de la ligne.
|
|
|
|
|
print $2, $4;
|
|
|
|
|
|
2022-07-11 15:46:32 +03:00
|
|
|
|
# AWK défini automatiquement beaucoup d'autres variables qui peuvent vous
|
|
|
|
|
# aider à inspecter et traiter chaque ligne. La plus importante est NF
|
2019-03-03 01:48:17 +03:00
|
|
|
|
|
|
|
|
|
# Affiche le nombre de champs de la ligne
|
|
|
|
|
print NF;
|
|
|
|
|
|
|
|
|
|
# Afficher le dernier champ de la ligne
|
|
|
|
|
print $NF;
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-12 14:32:27 +03:00
|
|
|
|
# Chaque règle est en réalité un test conditionnel.
|
2019-03-03 01:48:17 +03:00
|
|
|
|
|
|
|
|
|
a > 0 {
|
|
|
|
|
# Ceci s’exécutera une fois pour chaque ligne, tant que le test est positif
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-12 14:32:27 +03:00
|
|
|
|
# Les expressions régulières sont également des tests conditionnels.
|
2022-07-11 15:46:32 +03:00
|
|
|
|
# Si le test de l'expression régulières n'est pas vrais alors le bloc
|
2022-07-12 14:32:27 +03:00
|
|
|
|
# n'est pas exécuté.
|
2022-07-11 15:46:32 +03:00
|
|
|
|
|
|
|
|
|
$0 /^fobar/ {
|
2022-07-12 14:32:27 +03:00
|
|
|
|
print "la ligne commence par foobar"
|
2019-03-03 01:48:17 +03:00
|
|
|
|
}
|
|
|
|
|
|
2022-07-12 14:32:27 +03:00
|
|
|
|
# Dans le cas où vous voulez tester votre chaîne de caractères sur la ligne
|
2022-07-11 15:46:32 +03:00
|
|
|
|
# en cours de traitement $0 est optionnelle.
|
2019-03-03 01:48:17 +03:00
|
|
|
|
|
|
|
|
|
/^[a-zA-Z0-9]$/ {
|
|
|
|
|
print "La ligne courante ne contient que des caractères alphanumériques.";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2022-07-11 15:46:32 +03:00
|
|
|
|
# AWK peut parcourir un fichier texte ligne par ligne et exécuter des actions en
|
|
|
|
|
# fonction de règles établies. Cela est si courant sous UNIX qu'AWK est un
|
|
|
|
|
# langage de script.
|
2019-03-03 01:48:17 +03:00
|
|
|
|
|
2022-07-11 15:46:32 +03:00
|
|
|
|
# Ce qui suit est un exemple rapide d'un petit script, pour lequel AWK est
|
|
|
|
|
# parfait. Le script lit un nom à partir de l'entrée standard, puis affiche
|
|
|
|
|
# l'âge moyen de toutes les personnes portant ce prénom.
|
|
|
|
|
# Supposons que vous fournissiez comme argument le nom d'un fichier comportant
|
|
|
|
|
# ces données:
|
2019-03-03 01:48:17 +03:00
|
|
|
|
#
|
|
|
|
|
# Bob Jones 32
|
|
|
|
|
# Jane Doe 22
|
|
|
|
|
# Steve Stevens 83
|
|
|
|
|
# Bob Smith 29
|
|
|
|
|
# Bob Barker 72
|
|
|
|
|
#
|
|
|
|
|
# Le script est le suivant :
|
|
|
|
|
|
|
|
|
|
BEGIN {
|
|
|
|
|
|
|
|
|
|
# Premièrement, on demande à l'utilisateur le prénom voulu
|
2022-07-12 14:32:27 +03:00
|
|
|
|
print "Pour quel prénom voudriez vous savoir l'age moyen ?";
|
2019-03-03 01:48:17 +03:00
|
|
|
|
|
2022-11-23 23:26:20 +03:00
|
|
|
|
# On récupère la ligne à partir de l'entrée standard, pas de la ligne
|
|
|
|
|
# de commande :
|
2019-03-03 01:48:17 +03:00
|
|
|
|
getline name < "/dev/stdin";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Maintenant, pour chaque ligne dont le premier champ est le prénom donné
|
|
|
|
|
$1 == name {
|
|
|
|
|
|
2022-11-23 23:26:20 +03:00
|
|
|
|
# Ici, nous avons accès à un certain nombre de variables utiles déjà
|
|
|
|
|
# préchargées :
|
2019-03-03 01:48:17 +03:00
|
|
|
|
# $0 est la ligne entière
|
|
|
|
|
# $3 est le troisième champ. Ici il correspond à l'age qui nous intéresse
|
|
|
|
|
# NF est le nombre de champs et vaut 3
|
|
|
|
|
# NR est le nombre d'enregistrements (lignes) vus jusqu'à présent
|
|
|
|
|
# FILENAME est le nom du fichier en cours de traitement
|
|
|
|
|
# FS est séparateur de champs, ici c'est " " (un espace)
|
2022-11-23 23:26:20 +03:00
|
|
|
|
# ...etc. Et beaucoup d'autre que vous pouvez connaître dans le manuel de
|
|
|
|
|
# man. Pour cela exécutez "man awk" dans votre terminal.
|
2019-03-03 01:48:17 +03:00
|
|
|
|
|
|
|
|
|
# Garder une trace du total accumulé et du nombre de lignes correspondant.
|
|
|
|
|
sum += $3;
|
|
|
|
|
nlines++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Un autre motif spécial est END. Il fonctionnera après le traitement de tous
|
|
|
|
|
# les fichiers texte. Contrairement à BEGIN, il ne fonctionne que si vous lui
|
|
|
|
|
# donnez une entrée à traiter. Il sera exécuté une fois que tous les fichiers
|
|
|
|
|
# auront été lus et traités conformément aux règles et aux actions que vous
|
|
|
|
|
# avez fournies. Le but est généralement de produire un rapport final
|
|
|
|
|
# ou de faire quelque chose avec l'ensemble des données que vous avez
|
|
|
|
|
# accumulées au cours du script.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
END {
|
|
|
|
|
if (nlines)
|
|
|
|
|
print "L'age moyen pour le prénom " name " est " sum / nlines;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
Pour plus d'informations :
|
|
|
|
|
|
|
|
|
|
* [Awk tutorial](http://www.grymoire.com/Unix/Awk.html)
|
|
|
|
|
* [Awk man page](https://linux.die.net/man/1/awk)
|
2022-11-23 23:26:20 +03:00
|
|
|
|
* [The GNU Awk User's Guide](https://www.gnu.org/software/gawk/manual/gawk.html)
|
|
|
|
|
GNU Awk est dans la majorité des systèmes Linux.
|
2019-03-03 01:48:17 +03:00
|
|
|
|
* [AWK one-liner collection](http://tuxgraphics.org/~guido/scripts/awk-one-liner.html)
|