Supprimer les lignes vides
kyle> grep v ‘^$’ <fich1 >fich2
Trouver les gens qui n’ont pas le téléphone
kyle> egrep ‘[^0 9]{8}$’ fich1
Trouver les lignes non conformes
kyle> grep v ‘^[A Z][a z]+ [A Z]+ [0 9]{1,2} \
[1 9][0 2]? 19[0 9]{2} F|M [0 9]{8}$’ fich1
Cette solution est approximative. awk permet une analyse beaucoup plus fine. Le fichier check.awk contient :
{error=0 if (NF != 5) error++ if ($1 !~ /[A Z][a z]+/) error++ if ($2 !~ /[A Z]+/) error++ combien=split($3,ladat," ") if (combien != 3) error++ if (ladat[1] < 1 || ladat[1] > 31 ) error++ if (ladat[2] < 1 || ladat[2] > 12 ) error++ if (ladat[3] < 1789 || ladat[3] > 2002 ) error++ if (length($4) != 1) error++ if ($4 !~ /[MF]/) error++ if (length($5) != 10) error++ if ($5 !~ /0[0 9]{9}/) error++ if (error != 0) print NR,error,$0 }
Ce qui signifie : pour chaque ligne (condition manquante) l’action à entreprendre consiste à : mettre la variable error à zéro, variable qui sera incrémentée pour chaque anomalie détectée. Les vérifications sont ensuite faites dans l’ordre.
Vérifier que la ligne comporte cinq champs
Le premier champ doit être une majuscule suivie de minuscules
Le deuxième champ doit être une suite de majuscules
Couper le troisième champ en sous-champs sur le caractère « -«
Vérifier qu’il y a trois sous-champs
Que ces trois sous-champs ont des valeurs plausibles
Vérifier que le quatrième champ contient un seul caractère
Et que ce caractère est « M » ou « F » et rien d’autre
Vérifier que le cinquième champ comporte dix caractères
Et qu’il contient 0 suivi de dix chiffres
La commande suivante liste les lignes non conformes, en les faisant précéder du numéro de ligne et du nombre d’erreurs détectées :
kyle> awk –posix –f check.awk annuaire.txt
1 1 Georges TARTEMPION 12 2 1967 M 038898422524
5 3 Antonio VAVILDA 16 5 1937 M
7 11 J’en ai assez de ce travail fastidieux!
9 11 ligne vide
10 3 Anatole SUISSE 1 2 1965 n 4
11 1 Antonino SZWPRESWKY 16 5 8937 M 0298358745