====== 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á.