Я долго пытался написать скрипт, который бы имел 2 аргумента, 1 с просьбой выбрать год и 2 с просьбой выбрать, хочу ли я, чтобы минимальная, максимальная, средняя или все были показаны как последняя строка из файлов, связанных в выбранный год.
По сути, у меня есть каталог, который содержит подкаталоги разных лет (2000, 2001, 2002 и т. Д.), В этих каталогах есть подкаталоги по месяцам и дням, которые содержат (а) файл (ы), информирующий о популяциях (но не реальной информации) разных города как последняя строчка. Это часть дерева каталога:
.
|-- 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
Все файлы отформатированы одинаково:
2019-04-03
Wednesday
Newcastle-upon-Tyne
255362
Мне нужно написать скрипт, чтобы спросить, какой год мне нужен (выбрать этот каталог), а затем спросить, хочу ли я показать среднее, минимальное, максимальное или все вышеперечисленное для населения (это последняя строка файлов).
Это то, что я до сих пор:
#!/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
Это позволяет мне выбирать каталоги, но не дает мне ответов, которые мне нужны, просто выплевывает последние строки моих файлов.
источник
Ответы:
Если бы я реализовывал это в bash, я бы сделал следующее. Я не буду комментировать это много: не стесняйтесь задавать конкретные вопросы - сначала проверьте страницу руководства bash, если вы не знаете, как работает конкретная команда.
источник
Я пишу простой
awk
скрипт, который делает то же, что и вы:Объяснение в строке:
источник
Как написано, скрипт ничего не делает, кроме как печатает популяции, потому что avg и т. Д. Закомментированы.
Для вычисления avg эти популяции должны быть отправлены в функцию avg () с чем-то вроде ...
Подобные строки будут добавлены для min () и max ().
Вы можете использовать
case
оператор для вызова соответствующей функции (ей) ...1|4) echo ...
Вызывает эхо работать , если либо 1 или 4 введены. Таким образом, все 3 будут выполнены, если 4 были введены.источник
Спасибо за все ответы, вот что я закончил:
При выборе варианта (1-4) вместо ввода цифр необходимо ввести слово, которое я ненавижу, но меня попросили сделать это таким образом.
источник