J'ai du mal depuis longtemps à écrire un script qui aurait 2 arguments, 1 demandant de sélectionner une année et 2 demandant de sélectionner si je veux que le minimum, le maximum, la moyenne ou tout soit affiché comme dernière ligne des fichiers associés à l'année sélectionnée.
Fondamentalement, j'ai un répertoire qui contient des sous-répertoires d'années différentes (2000, 2001, 2002, etc.) dans ces répertoires sont des sous-répertoires pour les mois et les jours qui contiennent un (des) fichier (s) informant sur les populations (mais pas de vraies informations) de différents villes comme dernière ligne. Cela fait partie de l'arborescence du répertoire:
.
|-- 2000
| |-- 01
| | `-- 18
| | `-- ff_1177818640
| |-- 02
| | |-- 02
| | | `-- ff_1669027271
| | |-- 03
| | | `-- ff_234075290
| | |-- 10
| | | `-- ff_1584524530
| | |-- 14
| | | `-- ff_113807345
| | `-- 17
| | `-- ff_1452228827
| |-- 03
| | |-- 06
| | | `-- ff_58914249
| | `-- 11
| | `-- ff_2828212321
| |-- 04
| | `-- 17
| | `-- ff_302131884
| |-- 06
| | `-- 13
| | `-- ff_2175615745
| |-- 07
| | |-- 07
| | | `-- ff_918426998
| | `-- 24
| | `-- ff_2808316425
| |-- 08
| | `-- 27
| | `-- ff_1449825497
| |-- 09
| | `-- 19
| | `-- ff_110255856
| `-- 12
| `-- 08
| `-- ff_1621190
|-- 2001
| |-- 03
| | `-- 21
| | `-- ff_517010375
| |-- 05
| | `-- 27
| | `-- ff_1458621098
| |-- 06
| | |-- 07
| | | `-- ff_155853916
| | |-- 25
| | | |-- ff_2382312387
| | | `-- ff_270731174
| | `-- 29
| | `-- ff_3228522859
| |-- 07
| | `-- 28
| | `-- ff_3215021752
| |-- 09
| | `-- 24
| | `-- ff_1080314364
| `-- 11
| `-- 24
| `-- ff_2313722442
Tous les fichiers sont formatés de la même manière:
2019-04-03
Wednesday
Newcastle-upon-Tyne
255362
J'ai besoin d'écrire un script pour me demander de quelle année j'ai besoin (en sélectionnant ce répertoire) puis en demandant si je veux que la moyenne, le minimum, le maximum ou tout ce qui précède soit affiché pour la population (qui est la dernière ligne des fichiers).
Voici ce que j'ai jusqu'à présent:
#!/bin/bash
function min () {
echo $(sort -n populations | head -1)
}
function max () {
echo $(sort -n populations | tail -1)
}
function avg () {
count=0
sum=0
while read line ; do
num='echo ${line#* }'
sum='expr $sum + $num'
count='expr $count + 1'
done < populations
avg='expr $sum / $count'
echo $avg
}
echo "Please enter the year: "
read s1
echo "
Enter an option:
1. Minimum
2. Maximum
3. Average
4. All"
read s2
#echo $s2
for file in $(find ~/filesToSort/$s1 -type f) ; do
tail -1 $file >> populations
done
echo $(cat populations)
#min
#max
#avg
rm populations
Cela me permet de choisir des répertoires, mais ne me donne pas les réponses dont j'ai besoin, crache simplement les dernières lignes de mes fichiers.
la source
Réponses:
Si j'implémentais cela dans bash, je ferais ce qui suit. Je ne commenterai pas beaucoup à ce sujet: n'hésitez pas à poser des questions spécifiques - consultez d'abord la page de manuel de bash si vous ne savez pas comment fonctionne une commande particulière.
la source
J'écris un
awk
script simple qui fait la même chose que ce que vous faites:Explication en ligne:
la source
Tel qu'il est écrit, le script ne fera rien d'autre que d'imprimer les populations car avg, etc. sont commentés.
Pour calculer la moyenne, ces populations doivent être envoyées à la fonction avg () avec quelque chose comme ...
Des lignes similaires seraient ajoutées pour min () et max ().
Vous pouvez utiliser une
case
instruction pour appeler la ou les fonctions appropriées ...L'
1|4) echo ...
écho est exécuté si 1 ou 4 sont entrés. Ainsi, tous les 3 s'exécuteront si 4 a été entré.la source
Merci pour toutes les réponses, voici ce que j'ai fini avec:
Lors du choix de l'option (1-4) au lieu de mettre des chiffres, un mot doit être mis à la place, ce que je déteste mais on m'a demandé de le faire de cette façon.
la source