Cátedra: Osvaldo Clua
Fecha: Primera oportunidad
Día: 04/11/2008
Tema: UNIX
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.
#!/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"