Advertisement
anthonimes

TP4---EXOS2-6

Nov 13th, 2020 (edited)
434
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 5.90 KB | None | 0 0
  1. # TP4 --- Exercice 5
  2. #!/bin/bash
  3.  
  4. easier() {
  5.     # ^ indique le début de la ligne, $ la fin
  6.     debut=$( grep -n "^### BEGIN $2$" $1 | cut -d":" -f1 )
  7.     debut=$((debut+1))
  8.     fin=$( grep -n "^### END $2$" $1 | cut -d":" -f1 )
  9.     fin=$((fin-1))
  10.     head -n $fin $1 | tail -n +$debut | cut -c 3-
  11. }
  12.  
  13. easier $1 $2
  14.  
  15. extrait() {
  16.     lecture=0
  17.     while read ligne; do
  18.         if [ "$ligne" = "### END $2" ]; then
  19.             lecture=0
  20.         fi
  21.         if [ $lecture -eq 1 ]; then
  22.             echo "$ligne" | cut -c 3-
  23.         fi
  24.         if [ "$ligne" = "### BEGIN $2" ]; then
  25.             lecture=1
  26.         fi
  27.     done < $1
  28. }
  29.  
  30. extrait $1 $2 > $2
  31.  
  32. # TP4 --- Exercice 6
  33. #!/bin/bash
  34.  
  35. # version alternative
  36. #!/bin/bash
  37. #!/bin/bash
  38. #!/bin/bash
  39. afficherNotes() {
  40.     premiereNote=$(head -n1 $1 |cut -d ';' -f2)
  41.     eleveNote=$premiereNote
  42.     faibleNote=$premiereNote
  43.     # IFS permet de spécifier un nouveau délimiteur pour lire le fichier
  44.     while IFS=";" read etudiant note
  45.     do
  46.         if [[ $(echo "$note < $faibleNote" | bc) -eq 1 ]] ; then
  47.                 faibleNote=$note
  48.         fi
  49.         if [[ $(echo "$note > $eleveNote" | bc) -eq 1 ]]; then
  50.                 eleveNote=$note
  51.         fi
  52.     done < "$1"
  53.     echo "Note la plus elevé pour '$2': $eleveNote; Note la plus faible: $faibleNote"
  54. }
  55. for nom in $(ls "$1")
  56. do
  57.     fichier="$1/$nom"
  58.     if [ -f $fichier ]; then
  59.         afficherNotes "$fichier" "$nom"
  60.     fi
  61. done
  62.  
  63. afficherNotes $1
  64.  
  65. oneliner() {
  66.     for nom in $(ls "$1"); do
  67.         noteMin=$( sort -rn -k2 -t";" "$1/$nom" | tail -n 1 | cut -d";" -f2)
  68.         noteMax=$( sort -rn -k2 -t";" "$1/$nom" | head -n 1 | cut -d";" -f2)
  69.         echo $nom "note max = "$noteMax "note min = "$noteMin
  70.     done
  71. }
  72.  
  73. oneliner $1
  74.  
  75. minMax() {
  76. #  Attention : protection des noms de fichiers avec "" pour gérer les espaces
  77.     for nom in $( ls "$1"); do
  78.         nbLignes=$( wc -l < "$1/$nom")
  79.         ligne=$(cat "$1/$nom" | head -n 1 | tail -n 1)
  80.         noteMax=$( echo $ligne | cut -d ';' -f2)
  81.         noteMin=$noteMax
  82.         for i in $( seq 2 $nbLignes); do
  83.             ligne=$(cat "$1/$nom" | head -n $i | tail -n 1)
  84.             note=$( echo $ligne | cut -d ';' -f2)
  85.             if [ $(echo "$note > $noteMax" | bc) -eq 1  ]; then
  86.             # pour des valeurs entières
  87.             #if [ $note -gt $noteMax ]; then
  88.                 noteMax=$note
  89.             elif [ $(echo "$note < $noteMin" | bc) -eq 1 ]; then
  90.             # pour des valeurs entières
  91.             # elif [ $note -lt $noteMin ]; then
  92.                 noteMin=$note
  93.             fi
  94.         done
  95.         echo $nom "note max = "$noteMax "note min = "$noteMin
  96.     done
  97. }
  98.  
  99. minMax $1
  100.  
  101. maxEtud() {
  102.     max=0
  103.     nomMax=""
  104.     for nom in $( ls "$1"); do$
  105.     # si f est un fichier régulier
  106.     if [ -f $nom ]; then
  107.             #nbLignes=$( cat "$1/$nom" | wc - l)
  108.             nbLignes=$( wc -l < "$1/$nom")
  109.             if [ $nbLignes -gt $max ]; then
  110.                 max=$nbLignes
  111.                 nomMax=$nom            
  112.         fi
  113.     fi
  114.     done
  115.     # pour afficher *proprement* le nom du module, il faudrait enlever le ".csv"
  116.     echo $nomMax
  117. }
  118.  
  119. maxEtud $1
  120.  
  121. # TP4 --- Exercice 4
  122. #!/bin/bash
  123. fichier=$1
  124.  
  125. tatin() {
  126.     while read ligne; do
  127.         miroir=""
  128.         # attention : ne pas utiliser "$ligne" (le découpage ne se fera pas sinon)
  129.         for mot in $ligne; do
  130.             miroir="$mot $miroir"
  131.         done
  132.         echo $miroir
  133.     done
  134. }
  135.  
  136. if [ $# -eq 1 ]; then
  137.     tatin < $1
  138. else
  139.     tatin
  140. fi
  141.  
  142. # TP4 --- Exercice 3
  143. # la version one-liner
  144. #!/bin/bash
  145. if [ $# -ne 1 ]; then
  146.     echo "Usage : bash $0 nom_fichier"
  147.     exit 1
  148. fi
  149. nombre_doublons=$(sort $1 | uniq -c | sort -rn | head -n 1 | tr -s " " | cut -d" " -f2,3)
  150.  
  151. if [ $(echo "$nombre_doublons" | cut -c1) -eq 1 ]; then
  152.     echo "Aucun doublon dans le fichier"
  153. else
  154.     echo "Doublon détecté : $nombre_doublons"
  155. fi
  156.  
  157. # en utilisant des fonctions (cf slide 10 CM scripts)
  158. #!/bin/bash
  159. compter_ligne() {
  160.     # compte et retourne le nb d’occurrences d’un mot dans un fichier
  161.     # $2 est le fichier et $1 le mot à chercher
  162.     n=0
  163.     nblignes=$( cat $2 | wc -l )
  164.     for i in $(seq $nblignes); do
  165.         # récupère la ième ligne du fichier
  166.         ligne=$( head -n $i $2 | tail -n 1 )
  167.         if [ $ligne = $1 ]; then
  168.             n=$((n+1))
  169.         fi
  170.     done
  171.     return $n
  172. }
  173.  
  174. compter_ligne $1 $2
  175. # $? permet de récupérer la valeur de retour de la fonction appelée précédemment
  176. result=$?
  177. echo $result
  178.  
  179. compter_max() {
  180.     # cherche le mot avec le nb d’occurrences maximal
  181.     # retourne le 1er n°de ligne d’apparition du mot
  182.     taille=$( cat $1 | wc -l )
  183.     ligneMax=$( cat $1 | head -n 1 | tail -n 1)
  184.     compter_ligne $ligneMax $1
  185.     # $? contient le résultat retourné par chercher_ligne
  186.     max=$?
  187.     for i in $(seq 2 $taille); do
  188.         ligne=$( cat $1 | head -n $i | tail -n 1)
  189.         compter_ligne $ligne $1
  190.         n=$?
  191.         # la valeur de n est-elle plus grande que le max trouvé jusqu'à présent ?
  192.         if [ $max -lt $n ]; then
  193.             max=$n
  194.             ligneMax=$ligne
  195.         fi
  196.     done
  197.     # l'affichage se fait même si $max vaut 1 ; il faudrait une conditionnelle supplémentaire
  198.     echo $max/$ligneMax
  199. }
  200.  
  201. # l'appel final du script
  202. compter_max $1
  203.  
  204. # TP4 --- Exercice 2
  205. #!/bin/bash
  206. prix=$1
  207. recette=$2
  208.  
  209. # on enleve les lignes d'entete et on trie alphabetiquement
  210. # on sauve dans tmp
  211. tail -n +3 $1 | sort > /tmp/prix
  212. #idem
  213. tail -n +3 $2 | sort > /tmp/recette
  214. # on joint les 2 fichiers nettoyés et on ne garde que le prix et la qte
  215.  
  216. join /tmp/recette /tmp/prix | tr -s " " | cut -d" " -f2,4 > /tmp/rp
  217.  
  218. somme=0
  219.  
  220. # on lit /tmp/rp et pour chaque ligne on met le 1er mot dans q et le deuxieme dans p
  221. while read q p; do
  222.     # on utilise bc parce que c'est pas des entiers
  223.     somme=$(echo "$somme+$q*$p" | bc)
  224. done < /tmp/rp
  225.  
  226. echo $somme
  227.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement