Maîtriser Awk : Un Outil Puissant pour le Traitement de Texte et l'Analyse de Données

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 BEGIN initialise les variables et affiche un titre de rapport.
  • Le modèle NR > 1 assure que la première ligne (l'en-tête) est ignorée.
  • somme_ages += $2 cumule les âges (deuxième champ).
  • compteur_lignes++ incrémente le compteur pour chaque individu.
  • Le bloc END calcule 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é ---

Étiquettes: awk traitement de texte ligne de commande analyse de données Expressions Régulières

Publié le 23 juillet à 19h28