Tabla de Contenidos

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:

  1. Tengo permisos de lectura sobre los archivos y de escritura sobre el archivo de salida.
  2. Los campos de los archivos de entrada están separados por ”,” y los de salida por ”;”.
  3. Los paréntesis no vienen en los parámetros ($2).
  4. Los parámetros ($2) no tienen una cantidad de caracteres predefinida. Todos los caracteres de $2 son dígitos numéricos.
  5. Ningún campo de entrada tiene ”;”.
  6. 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á.