Exercices unix programmation script shell - awk
Rédigé par GC Team, Publié le 31 Juillet 2009, Mise à jour le Samedi, 17 Décembre 2022 20:16Les exercices portent sur le fichier mesure suivant:
nom de la mesure | | | lieu de la mesure | | | date de la mesure | | | valeur brute | | | correction 1 | | | correction 2 | | | correction 3 | | | valeur corrigée |
| |
marcel | | | brest | | | 18/12/1998 | | | 12.5 | | | 1.34 | | | 1.23 | | | -1.5 | | | 13.47 |
| |
polo | | | loctudy | | | 21/05/1997 | | | 11.5 | | | 1.24 | | | 1.12 | | | -1.2 | | | 12.66 |
| |
otto | | | camaret | | | 04/09/1995 | | | 9.3 | | | 0.98 | | | 1.17 | | | -1.12 | | | 10.33 |
| |
Le champ valeur corrigée est la somme algébrique de la valeur brute et des 3 corrections.
Exercice 1 {sidebar id=1}
Vous vous êtes bourrés sur le signe de la correction 1, de même dans la correction 2, vous avez découvert que vous avez commis une petite erreur et qu'il fallait lui ajouter 0.1. Modifier le fichier en prenant en compte ces corrections, faites en sorte que la valeur corrigée soit modifiée en conséquence.
Dans le même exercice vous afficherez la somme totale des valeurs corrigées et la valeur corrigée moyenne. Ces valeurs doivent être sauvegardées dans un fichier résultat.
Solution:
1 2 3 4 5 6 7 8 9 |
NR = =1 { printf("%s\n",$0)} NR>1 { $5*=-1 $6+=0.1 $8=$4+$5+$6+$7 somme+=$8 printf("%s\n",$0)} END { printf("somme totale des valeurs corrigées %f \n",somme) > "resultat"; printf("valeur corrigée moyenne %f \n" (somme/(NR-1)) >> "resultat"} ' $1 |
Appelez votre script exo1.awk, donnez lui les droits 755, et appelez le ainsi:
exo1.awk mesure > mesure.corrigee
Après exécution, vérifiez l'existence et le contenu du fichier resultat.
Exercice 2
Afficher les mesures ayant une année paire. Redirigez le résultat de la recherche vers un fichier paire.
Solution:
1 2 3 4 5 6 |
#!/bin/bash awk ' BEGIN { printf("Mesures ayant une année paire \n") > "paire";FS="|"} NR>1 { annee=substr($3,7,4) if (annee%2= =0) { printf("mesure %s ",$1); printf(" année %s paire\n ",annee) >> "paire"} ' $1 |
Appelez votre script exo2.awk, donnez lui les droits 755, et appelez le ainsi: {sidebar id=6}
exo2.awk mesure
Après exécution, vérifiez l'existence et le contenu du fichier paire.
Exercice 3
Vérifiez que le format de la date jj/mm/aaaa est correcte ainsi que le format du lieu (formé que de lettres de l'alphabet en minuscules ou majuscules).
Solution:
1 2 3 4 5 |
NR>1 && $2 !~ /^[0-3][0-9]\/[01][0-9]/\[0-9][0-9][0-9][0-9]$/ { printf(" Mauvais format de date pour mesure %s \n", $1 } NR>1 && $2 !~ /^[a-zA-Z][a-zA-Z]*$/ { printf(" Mauvais format du lieu pour mesure %s \n",$1 } ' $1 |
Appelez votre script exo3.awk, donnez lui les droits 755, et appelez le ainsi:
exo3.awk mesure
Le fonctionnement du script sous LINUX est un peu foireux, ça marche bien par contre sur d'autres environnements (HP-UX ou Solaris), va savoir pour quoi...
On pourrait améliorer encore plus la vérification en vérifiant bien que la date va de 1 à 31 et le mois de 1 à 12, avec un script du style:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#!/bin/csh NR>1 && $3 !~ /^[0-3][0-9]\/[01][0-9]/\[0-9][0-9][0-9][0-9]$/ { jour=substr($3,1,2) mois=substr($3,3,2) if (jour > 31 || mois >12) { printf("mauvais format pour mesure %s\n",$1)} } ' $1 |
C'est un peu lourd comme script, à vous de trouver plus simple. Toujours un fonctionnement capricieux sous LINUX.
Exercice 4
Afficher les noms de mesure et leur valeur corrigée associée en vous servant d'un tableau associatif.
Solution:
1 2 3 4 5 6 |
#!/bin/bash NR>1 { mesure-corrigee[$1]=$8 END { for (mesure in mesure-corrigee) {printf("mesure %s ",mesure); printf(" égale à %s \n",mesure-corrigee[mesure]) }} ' $1 |
Appelez votre script exo4.awk, donnez lui les droits 755, et appelez le ainsi:
exo4.awk mesure