====== Examen Parcial - 75.08 Sistemas Operativos - 03/11/2009 ======
**Cátedra:** Clúa
**Fecha:** 1er Oportunidad - 2do Cuatrimestre 2009
**Día:** 03/11/2009
**Tema:** Bash (Tema 1)
===== Enunciado =====
Se tiene un archivo de productos (**Productos.dat**) con el siguiente formato:\\
código producto, descripción producto, código tipo producto, código descuento, código zona, importe
Se tiene a su vez los siguientes archivos:
**TipoProducto.dat**, con el formato:\\
código tipo producto, descripción tipo producto
**Descuentos.dat**, con el formato:\\
código descuento, descripción descuento, porcentaje descuento
**Zonas.dat**, con el formato:\\
código zona, descripción zona
Se pide realizar un script que obtenga como salida un archivo de salida con la siguiente información:\\
descripción zona; código producto; descripción producto, descripción descuento, porcentaje, importe, importe con el descuento
Se podrá pasar uno de los siguientes parámetros\\
-p (nn) Se deben filtrar los productos cuyo porcentaje de descuento sea igual al ingresado\\
-l (nnn) Se deben filtrar los productos cuyos importes sean mayores al ingresado\\
-z (n) Se deben filtrar los productos que pertenecen a la zona ingresada.\\
Si no se ingresa parámetro listar todos los productos. Validar existencia de archivos antes de comenzar la ejecución, deben estar en el directorio /datos.
===== Resolución =====
Consideraciones:
- Tengo permisos de lectura sobre los archivos y de escritura sobre el archivo de salida.
- Los campos de los archivos de entrada están separados por "," y los de salida por ";".
- Los paréntesis no vienen en los parámetros ($2).
- Los parámetros ($2) no tienen una cantidad de caracteres predefinida. Todos los caracteres de $2 son dígitos numéricos.
- Ningún campo de entrada tiene ";".
- Solo hay un registro para cada código de zona en el archivo de zona, etc.
#!/bin/bash
function uso() {
# mostrar forma de uso.
}
dir_datos="/datos"
a_t_prod="$dir_datos/TipoProducto.dat"
a_desc="$dir_datos/Descuentos.dat"
a_zona="$dir_datos/Zonas.dat"
a_prod="$dir_datos/Productos.dat"
a_salida="$dir_datos/Salida.dat"
if [ ! -f "$a_t_prod" -o ! -f "$a_desc" -o ! -f "$a_zona" -o ! -f "$a_prod" ]; then
echo "No existe alguno de los archivos requeridos."
exit 1
fi
if [ $# -ne 0 -a $# -ne 2 ]; then
uso
exit 2
fi
if [ $# -eq 2 ]; then
if [ "$1" != "-p" -o "$1" != "-l" -o "$1" != "-z" ]; then
uso
exit 2
fi
valparam=`echo "$2" | grep '^[0-9]*$' &> /dev/null`
if [ $? -ne 0 ]; then
uso
exit 2
fi
fi
IFS_OLD="$IFS" # Esto no es necesario a menos que se corra sourced.
IFS=","
> $a_salida
while read -a campos; do
desc_zona=`grep "^${campos[4]}," $a_zona | cut -d "," -f 2` ## 4 = codZona
registro="${desc_zona};${campos[0]};${campos[1]};" ## 0 = codProd , 1 = descProd
linea_desc=`grep "^${campos[3]}" $a_desc` ## 3 = codDesc
desc_desc=${linea_desc#*,}
desc_desc=${desc_desc%,*}
porcentaje=${linea_desc##*,}
registro="${registro}${desc_desc};${porcentaje};${campos[5]};" ## 5 = importe
importe_final=`echo "${campos[5]} - ((${campos[5]} * $porcentaje) / 100)" | bc -l` ## 5 = importe
registro="${registro}$importe_final"
mostrar=0
if [ $# -eq 2 ]; then
case "$1" in
-p)
if [ $2 -eq $porcentaje ]; then
mostrar=1
fi
;;
-l)
if [ ${campos[5]} -gt $2 ]; then ## Considero importe inicial !!
mostrar=1
fi
;;
-z)
if [ "$2" == "${campos[4]}" ]; then ## 4 = codZona
mostrar=1
fi
;;
esac
fi
if [ $mostrar -eq 0 ]; then
echo "$registro" >> $a_salida
fi
done < $a_prod
IFS="$IFS_OLD" # Esto no es necesario a menos que se corra sourced.
exit 0
===== Discusión =====
Si ves algo que te parece incorrecto en la resolución y no te animás a cambiarlo, dejá tu comentario acá.