He estado luchando durante mucho tiempo para escribir un script que tenga 2 argumentos, 1 pidiendo seleccionar un año y 2 pidiendo seleccionar si quiero que se muestre mínimo, máximo, promedio o todo como la última línea de los archivos relacionados al año seleccionado.
Básicamente, tengo un directorio que contiene subdirectorios de diferentes años (2000, 2001, 2002, etc.) en esos directorios son subdirectorios para meses y días que contienen (a) archivos que informan sobre poblaciones (aunque no información real) de diferentes ciudades como la última línea. Esa es una parte del árbol del directorio:
.
|-- 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 los archivos están formateados de la misma manera:
2019-04-03
Wednesday
Newcastle-upon-Tyne
255362
Necesito escribir un script para que me pregunten qué año necesito (seleccionando ese directorio) y luego preguntando si quiero que se muestre promedio, mínimo, máximo o todo lo anterior para la población (que es la última línea de los archivos).
Esto es lo que tengo hasta ahora:
#!/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
Esto me permite elegir directorios, pero no me da las respuestas que necesito, solo escupe las últimas líneas de mis archivos.
fuente
Respuestas:
Si implementara esto en bash, haría lo siguiente. No voy a comentar mucho sobre eso: siéntase libre de hacer preguntas específicas , consulte la página de manual de bash primero si no sabe cómo funciona un comando en particular.
fuente
Escribo un
awk
script simple que hace lo mismo que estás haciendo:Explicación en línea:
fuente
Tal como está escrito, el guión no hará más que imprimir las poblaciones porque el promedio, etc., está comentado.
Para calcular el promedio, esas poblaciones deben enviarse a la función avg () con algo como ...
Se agregarían líneas similares para min () y max ().
Podría usar una
case
instrucción para llamar a las funciones apropiadas ...Esto
1|4) echo ...
hace que el eco se ejecute si se ingresa 1 o 4. Por lo tanto, los 3 se ejecutarán si se ingresó 4.fuente
Gracias por todas las respuestas, esto es lo que terminé con:
Al elegir la opción (1-4) en lugar de poner números, debe introducirse una palabra, lo cual odio, pero me pidieron que lo hiciera de esta manera.
fuente