Estou lutando há muito tempo para escrever um script que tenha 2 argumentos, 1 pedindo para selecionar um ano e 2 pedindo para selecionar se eu quero que mínimo, máximo, média ou tudo seja mostrado como a última linha dos arquivos relacionados para o ano selecionado.
Basicamente, eu tenho um diretório que contém subdiretórios de anos diferentes (2000, 2001, 2002 etc.) nesses diretórios são subdiretórios por meses e dias que contêm (a) arquivo (s) informando sobre populações (embora não sejam informações reais) de diferentes cidades como a última linha. Isso faz parte da árvore do diretório:
.
|-- 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
Todos os arquivos são formatados da mesma maneira:
2019-04-03
Wednesday
Newcastle-upon-Tyne
255362
Preciso escrever um script para ser perguntado em que ano preciso (selecionando esse diretório) e depois perguntando se quero que a média, o mínimo, o máximo ou todas as opções acima sejam exibidas para a população (que é a última linha dos arquivos).
Isto é o que eu tenho até agora:
#!/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
Isso me permite escolher diretórios, mas não me fornece as respostas necessárias, apenas cospe as últimas linhas dos meus arquivos.
fonte
Respostas:
Se eu estivesse implementando isso no bash, faria o seguinte. Não vou comentar muito: fique à vontade para fazer perguntas específicas - verifique a página do manual do bash se você não souber como um comando específico funciona.
fonte
Eu escrevo um
awk
script simples que faz o mesmo que você está fazendo:Explicação em linha:
fonte
Como está escrito, o script não fará nada além de imprimir as populações porque avg etc. são comentados.
Para calcular o avg, essas populações devem ser enviadas para a função avg () com algo como ...
Linhas semelhantes seriam adicionadas para min () e max ().
Você pode usar uma
case
instrução para chamar as funções apropriadas ...Isso
1|4) echo ...
faz com que o eco seja executado se 1 ou 4 forem inseridos. Assim, todos os 3 serão executados se 4 for inserido.fonte
Obrigado por todas as respostas, aqui está o que eu acabei com:
Ao escolher a opção (1-4), em vez de digitar números, uma palavra deve ser inserida, o que eu odeio, mas fui solicitado a fazer dessa maneira.
fonte