Vous êtes sur la page 1sur 3

awk

Quelques exemples d'utilisation de cette commande.


Voir : http://www.gecif.net/articles/linux/shell.html ou http://lea-linux.org/documentations/Dev-awk
Fonctions awk : http://www.shellunix.com/awk.html#char

1 Dans notre exemple, chaque champ est séparé par un ou plusieurs blancs. Le
séparateur peut être modifie comme on le veut par la variable globale FS.
Pour l'instant, FS = " " .
2 AWK compte le nombre de champs d'une ligne courante; ce nombre est placé dans la variable
globale NF (dans l'exemple, NF est variable).
3 AWK compte le nombre de lignes du fichier d'entrée; ce nombre est placé dans la
variable globale NR (dans l'exemple, NR = 9).
4 Les champs sont désignés par $1, $2, etc. $0 représente toute la ligne.

Les exercices sont effectués sur le fichier suivant :

$ cat essai
Bonjour,

Ceci est un fichier de test.


Ceci la ligne numéro 4.

# ceci est un commentaire


Ceci est la ligne numéro 7.

Au revoir

Manipulations sur les champs :


pour chaque ligne du fichier essai, on veut afficher la ligne avec le champs 2 égal à "" (vide). Le
séparateur est le caractère espace.

$ awk -F" " '{$2=""; print $0}' essai


Bonjour,

Ceci un fichier de test.


Ceci ligne numéro 4.

# est un commentaire
Ceci la ligne numéro 7.

Au

Blocs BEGIN et END :


On veut compter le nombre de lignes du fichier essai :

$ awk 'END {print NR}' essai


9

On note que l'on n'exécute que le bloc END de awk. Ce bloc ne s'exécute qu'une fois, après la fin du
traitement des lignes (tout comme le bloc BEGIN ne s'exécute qu'une fois avant le parcours du
fichier).

Même exercice avec exécution du bloc central de awk : ce bloc s'exécute pour chaque ligne du fichier

$ awk '{print NR}' essai


1
2
3
4
5
6
7
8
9

Transformations et utilisation des formats et de printf


On peut utiliser la commande printf pour définir des formats d'affichage particuliers. La forme de
cette commande est similaire à celle du langage C :
awk -F" " '{printf ("formats",data1, data2, ...) fichier_entree

Soit un fichier nommé awk_entree :

$ cat awk_entree
alexandre moniteur 65 63 74
kernighan programmeur 25 8 41
mofiset sources 54 69 32
charles-andre restauration 62 2 37

On souhaite appliquer à ce fichier les transformations et traitement suivant :


- réorganiser l'ordre des colonnes pour obtenir dans l'ordre : col 2, col4, 3 premiers caractères de la
colonne 1, col 3, col 5
- le format de la colonne 4 sera toujours sur 2 chiffres (02 p.ex)
- le fichier d'entrée utilise la tabulation comme séparateur qu'on on veut remplacer par ";" en sortie.

Le résultat attendu est :


$ cat awk_sortie
moniteur;63;ale;65;74
programmeur;08;ker;25;41
sources;69;mof;54;32
restauration;02;cha;62;37

La commande à utiliser :

$ awk -F'\t' '{printf("%s;%02d;%s;%d;%d\n",$2,$4,substr($1,1,3),$3,$5)}' awk_entree


>awk_sortie

On constate que par ce moyen, on peut réaliser des transformations très intéressantes sur les fichiers
de texte. Très utile dans les échanges inter-bases de données. Autre exemple dans le même domaine :
on dispose d'un gros fichier dont on connais la structure de façon incomplète. On veut l'importer
dans une base de données. Avant de créer la table d'accueil, on a besoin de connaitre la taille
maximale de chaque colonne. À noter que sur un fichier de deux millions de lignes le traitement se
fait en 1 ou 2 secondes.

Sur le même fichier. On veut connaitre la longueur maximale d'une colonne.

$ awk -F'\t' '{len=length($1);if (max<len){max=len}}END{print "longueur max : ",max}'


awk_entree

Même traitement en utilisant un programme avec awk :


Le programme prog_awk :
{
len=length($1);
if (max<len){
max=len;
}
}
END {
print "longueur max : ",max;
}

L'exécution :

$ awk -F'\t' -f prog_awk awk_entree