Ich habe lange Zeit damit gekämpft, ein Skript zu schreiben, das zwei Argumente enthält, von denen eines zur Auswahl eines Jahres und zwei zur Auswahl, ob Minimum, Maximum, Durchschnitt oder alle als letzte Zeile aus den zugehörigen Dateien angezeigt werden sollen auf das gewählte Jahr.
Grundsätzlich habe ich ein Verzeichnis, das Unterverzeichnisse verschiedener Jahre (2000, 2001, 2002 usw.) enthält. In diesen Unterverzeichnissen befinden sich Unterverzeichnisse für Monate und Tage, die (eine) Datei (en) enthalten, die über Populationen (jedoch keine wirklichen Informationen) verschiedener Personen informieren Städte als letzte Zeile. Das ist ein Teil des Verzeichnisbaums:
.
|-- 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
Alle Dateien werden auf die gleiche Weise formatiert:
2019-04-03
Wednesday
Newcastle-upon-Tyne
255362
Ich muss ein Skript schreiben, um zu fragen, welches Jahr ich brauche (Auswahl dieses Verzeichnisses) und dann zu fragen, ob der Durchschnitt, das Minimum, das Maximum oder alle der oben genannten Werte für die Grundgesamtheit angezeigt werden sollen (dies ist die letzte Zeile der Dateien).
Das habe ich bisher:
#!/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
Auf diese Weise kann ich Verzeichnisse auswählen, bekomme aber nicht die Antworten, die ich brauche, sondern spucke nur die letzten Zeilen meiner Dateien aus.
quelle
Antworten:
Wenn ich dies in bash implementieren würde, würde ich Folgendes tun. Ich werde nicht viel dazu sagen: zögern Sie nicht, bestimmte Fragen zu stellen - lesen Sie zuerst die bash-Manpage, wenn Sie nicht wissen, wie ein bestimmter Befehl funktioniert.
quelle
Ich schreibe ein einfaches
awk
Skript, das genau so funktioniert wie Sie:Erklärung inline:
quelle
Wie geschrieben, gibt das Skript nur die Populationen aus, da avg usw. auskommentiert sind.
Um den Durchschnitt zu berechnen, müssen diese Populationen mit so etwas wie ... an die Funktion avg () gesendet werden.
Ähnliche Zeilen würden für min () und max () hinzugefügt.
Sie könnten eine
case
Anweisung verwenden, um die entsprechenden Funktionen aufzurufen ...Das
1|4) echo ...
bewirkt, dass das Echo ausgeführt wird, wenn 1 oder 4 eingegeben werden. Somit werden alle 3 ausgeführt, wenn 4 eingegeben wurde.quelle
Vielen Dank für all die Antworten, hier ist, was ich am Ende mit:
Wenn Sie die Option (1-4) wählen, anstatt Zahlen einzugeben, müssen Sie stattdessen ein Wort eingeben, was ich hasse, aber gebeten wurde, dies auf diese Weise zu tun.
quelle