Examen Parcial - 75.08. Sistemas Operativos

Cátedra: Osvaldo Clua
Fecha: Primera oportunidad
Día: 04/11/2008
Tema: UNIX

Enunciado

Una fábrica de autopartes cuenta con el registro mensual de sus ventas (VENTAS.DAT), con el siguiente formato:

Código de producto;Código sucursal;Importe (Ej: 15225;204;48,30)

Queda claro que el archivo contendrá ventas de varios Códigos de productos de varias sucursales.

Además cuenta con información de sus Productos y Sucursales en una tabla (Parametros.txt) cuyos registros tienen el siguiente formato:

Tipo registro;Código;Descripción (Ej: 1;204;panel trasero) (Ej: 2;1350;Sucursal Norte)

El tipo de registro 1 corresponde a códigos y descripciones de productos y el tipo de registro 2 corresponde a sucursales. Tener en cuenta que el mismo código puede corresponder a una sucursal o a un producto, se diferencian por el tipo de registro.

Se pide realizar un script que:

- Realice las siguientes validaciones sobre el archivo de ventas: El código de producto y el de sucursal deben existir en el archivo Parametros.txt y el importe debe ser > 0, los registros erróneos dejarlos en VENTAS.ERR. Si el archivo tiene menos de 50 líneas rechazarlo (mover sus registros a VENTAS.ERR).

- Se tendrá que manejar el parámetro -s <Cod Sucursal>, será el único parámetro válido, en cuyo caso se deberá mostrar solo la sucursal elegida, con el siguiente formato:

Sucursal código de sucursal - descripción sucursal Total Ventas = Sumatoria de importe del Producto

(Ej: Sucursal 25204 - Norte Total Ventas = 505200,5)

- El script invocado sin parámetros realizara las validaciones y mostrará por la salida standard el total general de las ventas. El archivo validado dejarlo nombrado VENTAS_OK.DAT

Se pide también utilizar al menos una vez el comando for.

Resolucion

#!/bin/bash
 
#~ GonchuB
#~ 03-11-2009
#~ UNIX
 
ARCHIVO_VENTAS="VENTAS.dat"
ARCHIVO_VENTAS_VALIDADO="VENTAS_OK.DAT"
#~ Código de producto;Código sucursal;Importe (Ej: 15225;204;48,30)
ARCHIVO_PARAMETROS="Parametros.txt"
#~ Tipo registro;Código;Descripción (Ej: 1;204;panel trasero) (Ej: 2;1350;Sucursal Norte)
ARCHIVO_ERRORES="VENTAS.ERR"
 
> $ARCHIVO_ERRORES
> $ARCHIVO_VENTAS_VALIDADO
 
#~ Inicializo el total de la sucursal en 0.
TOTAL_SUCURSAL=0.0
 
#~ Guardo el Internal field separator.
OLD_IFS=$IFS
 
#~ Seteo un nuevo IFS en ;
IFS=';'
#~ Guardo la linea leida como un array.
while read -a LINEA_VENTAS
do
        #~ Extraigo los valores de la linea leida.
        CODIGO_PRODUCTO=${LINEA_VENTAS[0]}
        CODIGO_SUCURSAL=${LINEA_VENTAS[1]}
 
        #~ Seteo el IFS a su estado original para poder hacer grep.
        IFS=$OLD_IFS
        REGISTRO_PRODUCTO=$(grep "1;$CODIGO_PRODUCTO" $ARCHIVO_PARAMETROS)
        REGISTRO_SUCURSAL=$(grep "2;$CODIGO_SUCURSAL" $ARCHIVO_PARAMETROS)
 
        #~ Verifico que el importe no sea negativo.
        if [ ! -z $(echo ${LINEA_VENTAS[2]} | grep "^-") ] ; then
                echo "El importe debe ser mayor a 0 en la venta ${LINEA_VENTAS[0]}"
                echo "${LINEA_VENTAS[0]};${LINEA_VENTAS[1]};${LINEA_VENTAS[2]}" >> $ARCHIVO_ERRORES
        else
                #~ Verifico que el producto este en el archivo de parametros.
                if [ -z "$REGISTRO_PRODUCTO" ] ; then
                        echo "No existe el producto con codigo $CODIGO_PRODUCTO"
                        echo "${LINEA_VENTAS[0]};${LINEA_VENTAS[1]};${LINEA_VENTAS[2]}" >> $ARCHIVO_ERRORES
                else
                        #~ Verifico que la sucursal este en el archivo de parametros.
                        if [ -z "$REGISTRO_SUCURSAL" ] ; then
                                echo "No existe la sucursal con codigo $CODIGO_SUCURSAL"
                                echo "${LINEA_VENTAS[0]};${LINEA_VENTAS[1]};${LINEA_VENTAS[2]}" >> $ARCHIVO_ERRORES
                        else
                                echo "${LINEA_VENTAS[0]};${LINEA_VENTAS[1]};${LINEA_VENTAS[2]}" >> $ARCHIVO_VENTAS_VALIDADO
                        fi
                fi
        fi
 
        #~ Si recibi parametros.
        if [ "$#" -ge "1" ] ; then
                #~ Si el primer parametro no es "-s", la ejecucion fue invalida.
                if [ $1 != "-s" ] ; then
                        echo "Ejecucion invalida."
                        echo "Ejemplo de ejecucion: ./script.sh -s <codigo de sucursal>"
                #~ Extraigo la sucursal pedida por parametro.
                else
                        CODIGO_SUCURSAL_PEDIDA=$2
                        #~ Extraigo la descripcion del registro de la sucursal.
                        #~ DESCRIPCION_SUCURSAL_PEDIDA=$(echo $REGISTRO_SUCURSAL | sed "s/^[^;]*;[^;]*;\([^;]*\)/\1/")
                        #~ Como me piden que use un for, lo uso aca.
                        IFS=";"
                        FIELDNO=1
                        for FIELD in $REGISTRO_SUCURSAL
                        do
                                if [ $FIELDNO -eq "3" ] ; then
                                        DESCRIPCION_SUCURSAL_PEDIDA=$FIELD
                                fi
                                FIELDNO=$(($FIELDNO + 1))
                        done
                fi
        fi
 
        #~ Si no recibi sucursal por la cual filtrar.
        if [ -z $CODIGO_SUCURSAL_PEDIDA ] ; then
                TOTAL_SUCURSAL=`echo $TOTAL_SUCURSAL + $(echo ${LINEA_VENTAS[2]} | sed "s/\(^[^,]*\),\([^,]*\)/\1\.\2/") | bc`
        #~ Si recibi sucursal por la cual filtrar, solo sumo los importes cuyo codigo de sucursal
        #~ sea igual a la pedida.
        else
                if [ $CODIGO_SUCURSAL_PEDIDA == $CODIGO_SUCURSAL ] ; then
                        TOTAL_SUCURSAL=`echo $TOTAL_SUCURSAL + $(echo ${LINEA_VENTAS[2]} | sed "s/\(^[^,]*\),\([^,]*\)/\1\.\2/") | bc`
                fi
        fi
 
        IFS=';'
done < $ARCHIVO_VENTAS
 
IFS=$OLD_IFS
 
if [ -z $CODIGO_SUCURSAL_PEDIDA ] ; then
        CODIGO_SUCURSAL_PEDIDA="Todas"
        DESCRIPCION_SUCURSAL_PEDIDA="Todas"
fi
 
echo "Sucursal $CODIGO_SUCURSAL_PEDIDA - $DESCRIPCION_SUCURSAL_PEDIDA - Total Ventas = $TOTAL_SUCURSAL"
materias/75/08/parcial_20081104_unix.txt · Última modificación: 2013/05/19 15:40 por Gonchub
 
Excepto donde se indique lo contrario, el contenido de esta wiki se autoriza bajo la siguiente licencia: CC Attribution-Noncommercial-Share Alike 3.0 Unported


Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki