Avantages et Inconvénients d'Awk
Awk est un langage de script polyvalent, idéal pour la manipulation de fichiers texte et l'extraction de données. Il excelle particulièrement avec les données structurées en colonnes.
Avantages :
- Capacités de Traitement de Texte Robustes : Extrêmement efficace pour l'analyse de données tabulaires ou délimitées.
- Variables Intégrées Riches : Simplifie l'accès aux champs, aux numéros de ligne et à d'autres métadonnées.
- Support des Expressions Régulières : Offre une grande flexibilité pour la correspondance de motifs complexes.
- Gestion des Variables et Tableaux : Permet d'implémenter des logiques plus élaborées et des agrégations de données.
- Support de Scripting : Adapté aux tâches de traitement de texte complexes via des scripts dédiés.
- Haute Performence : Souvent plus rapide que d'autres langages de script pour le traitement de grands volumes de données textuelles.
Inconvénients :
- Syntaxe Particulière : Sa grammaire est unique et peut demander un temps d'adaptation pour les nouveaux utilisateurs, surtout ceux habitués à Python ou Perl.
- Inadapté aux Fichiers Binaires : Conçu exclusivement pour le traitement de fichiers texte brut.
- Lisibilité Réduite pour les Logiques Complexes : Des scripts Awk trop compliqués peuvent devenir difficiles à comprendre et à maintenir.
Opérations d'Affichage
Considérons le fichier donnees.csv suivant pour nos exemples :
Name,Age,City,Occupation
Alice,30,New York,Engineer
Bob,24,London,Designer
Charlie,35,Paris,Doctor
David,28,New York,Engineer
Eve,42,London,Artist
Afficher une Ligne Entière
Pour afficher chaque ligne du fichier sans modification, utilisez la commande suivante :
awk '{print}' donnees.csv
Ceci produira l'intégralité du contenu du fichier.
Afficher des Champs Spécifiques
Pour extraire des colonnes précises, spécifiez le délimiteur avec l'option -F et référez-vous aux champs par $N :
awk -F',' '{print $1, $3}' donnees.csv
Résultat :
Name City
Alice New York
Bob London
Charlie Paris
David New York
Eve London
Comparaisons Numériques
Il est possible de filtrer les lignes en fonction de la valeur numérique d'un champ :
awk -F',' '$2 > 30 {print $0}' donnees.csv
Ceci affichera toutes les lignes où l'âge (deuxième champ) est supérieur à 30 :
Charlie,35,Paris,Doctor
Eve,42,London,Artist
Comparaisons de Chaînes de Caractères
Pour filtrer les lignes basées sur une correspondance exacte de chaîne dans un champ :
awk -F',' '$3 == "New York" {print $1, $2}' donnees.csv
Sortie affichant le nom et l'âge des personnes résidant à "New York" :
Alice 30
David 28
Filtrage par Expressions Régulières
Utilisez l'opérateur ~ pour faire correspondre un champ à une expression régulière :
awk -F',' '$4 ~ /Engineer/ {print $0}' donnees.csv
Les lignes où le quatrième champ (profession) contient "Engineer" seront affichées :
Alice,30,New York,Engineer
David,28,New York,Engineer
Opérations Logiques
Awk supporte les opérateurs logiques (&&, ||, !). Voici un exemple pour exclure des lignes :
awk -F',' '$3 != "London" {print $0}' donnees.csv
# Ou en utilisant une expression régulière pour une non-correspondance
awk -F',' '$3 !~ /London/ {print $0}' donnees.csv
Ces commandes affichent toutes les lignes dont la ville n'est pas "London" :
Name,Age,City,Occupation
Alice,30,New York,Engineer
Charlie,35,Paris,Doctor
David,28,New York,Engineer
Modification de Champs
Modifier la Valeur d'un Champ
Vous pouvez attribuer une nouvelle valeur à un champ. Il est recommandé de définir OFS (Output Field Separator) pour que les champs modifiés soient correctement séparés à l'impression :
awk -F',' 'BEGIN{OFS=","} {if ($4 == "Engineer") $4="Développeur Logiciel"; print}' donnees.csv
Résultat après modification de la profession "Engineeer" :
Name,Age,City,Occupation
Alice,30,New York,Développeur Logiciel
Bob,24,London,Designer
Charlie,35,Paris,Doctor
David,28,New York,Développeur Logiciel
Eve,42,London,Artist
Ajouter un Nouveau Champ
Il est simple d'ajouter un champ virtuel à chaque ligne en lui attribuant une valeur. Ici, nous ajoutons un champ "Statut" :
awk -F',' 'BEGIN{OFS=","} {$5="Actif"; print}' donnees.csv
Les lignes incluent désormais un cinquième champ :
Name,Age,City,Occupation,Actif
Alice,30,New York,Engineer,Actif
Bob,24,London,Designer,Actif
Charlie,35,Paris,Doctor,Actif
David,28,New York,Engineer,Actif
Eve,42,London,Artist,Actif
Supprimer (Masquer) un Champ
Awk ne propose pas de suppression directe d'un champ au sens de l'enlever physiquement de la structure des délimiteurs. La méthode courante consiste à vider son contenu ou à réimprimer seulement les champs désirés.
Mettre un champ à vide :
awk -F',' 'BEGIN{OFS=","} {$3=""; print}' donnees.csv
La colonne "City" est maintenant vide :
Name,Age,,Occupation
Alice,30,,Engineer
Bob,24,,Designer
Charlie,35,,Doctor
David,28,,Engineer
Eve,42,,Artist
Alternativement, pour "supprimer" un champ en ne le réimprimant pas :
awk -F',' 'BEGIN{OFS=","} {print $1, $2, $4}' donnees.csv
Ceci affiche uniquement le Nom, l'Âge et la Profession :
Name,Age,Occupation
Alice,30,Engineer
Bob,24,Designer
Charlie,35,Doctor
David,28,Engineer
Eve,42,Artist
Concepts Avancés : Blocs et Scripts
Les Blocs BEGIN et END
Les blocs BEGIN et END permettent d'exécuter des actions avant le traitement des données et après celui-ci, respectivement. Ils sont souvent utilisés pour l'initialisation et la finalisation des traitements.
Exemple : Calcul de l'âge moyen à partir du fichier donnees.csv :
awk -F',' '
BEGIN {
somme_ages = 0;
compteur_lignes = 0;
print "--- Rapport d\'Age Moyen ---"
}
NR > 1 { # Exclut la ligne d\'en-tête (NR == 1)
somme_ages += $2;
compteur_lignes++;
}
END {
if (compteur_lignes > 0) {
print "Nombre total d\'individus traités :", compteur_lignes;
print "Somme des âges :", somme_ages;
print "Age moyen :", somme_ages / compteur_lignes;
} else {
print "Aucune donnée à traiter."
}
}' donnees.csv
- Le bloc
BEGINinitialise les variables et affiche un titre de rapport. - Le modèle
NR > 1assure que la première ligne (l'en-tête) est ignorée. somme_ages += $2cumule les âges (deuxième champ).compteur_lignes++incrémente le compteur pour chaque individu.- Le bloc
ENDcalcule et affiche l'âge moyen après le traitement de toutes les lignes de données.
Sortie générée :
--- Rapport d'Age Moyen ---
Nombre total d'individus traités : 5
Somme des âges : 159
Age moyen : 31.8
Variables et Tableaux Associatifs
Awk supporte l'utilisation de variables personnalisées et de tableaux associatifs (ou dictionnaires). Les tableaux sont particulièrement utiles pour agréger des données par clé.
Exemple : Compter le nombre d'individus par ville :
awk -F',' '
BEGIN {
print "--- Rapport de Population par Ville ---"
}
NR > 1 {
comptes_par_ville[$3]++; # La ville est utilisée comme clé pour le tableau
}
END {
for (ville in comptes_par_ville) { # Itère sur les clés du tableau
print ville ": " comptes_par_ville[ville]
}
}' donnees.csv
Sortie affichant la répartition par ville :
--- Rapport de Population par Ville ---
New York: 2
London: 2
Paris: 1
Scripts Awk Plus Complexes
Pour des programmes Awk plus élaborés, il est préférable de les enregistrer dans un fichier de script dédié (par exemple, script_metier.awk) et de l'exécuter avec l'option -f.
Exemple de fichier script_metier.awk :
# script_metier.awk
BEGIN {
FS = ","; # Définit le séparateur d\'entrée
OFS = ","; # Définit le séparateur de sortie
print "Nom,Age,Nouvelle_Profession,Statut" # En-tête personnalisé
}
NR > 1 {
# Initialise la nouvelle profession avec la profession actuelle
nouvelle_profession = $4;
# Logique de remapping des professions
if ($4 == "Engineer") {
nouvelle_profession = "Ingénieur Logiciel";
} else if ($4 == "Designer") {
nouvelle_profession = "Concepteur UX/UI";
}
# Affiche les champs requis avec les modifications et un nouveau statut
print $1, $2, nouvelle_profession, "Actif";
}
END {
print "--- Traitement terminé ---"
}
Exécution du script :
awk -f script_metier.awk donnees.csv
Sortie finale :
Nom,Age,Nouvelle_Profession,Statut
Alice,30,Ingénieur Logiciel,Actif
Bob,24,Concepteur UX/UI,Actif
Charlie,35,Doctor,Actif
David,28,Ingénieur Logiciel,Actif
Eve,42,Artist,Actif
--- Traitement terminé ---