====== Examen Parcial - 75.08. Sistemas Operativos ======
**Cátedra:** Osvaldo Clua\\
**Fecha:** Primera oportunidad \\
**Día:** 27/05/2008\\
**Tema:** UNIX
===== Enunciado =====
Una entidad bancaria cuenta con el registro mensual de las cajas de ahorro de sus sucursales (SALDOSCA.DAT), con el siguiente formato:\\
Nro CA;Cod. Sucursal;saldo (Ej. 15225;204;48,30). Queda claro que este archivo contedrá saldo de **varias** Cajas de ahorro de **varias** sucursales.\\
Ademá cuenta con información de sus sucursales (sucursales.txt):\\
Cod. Sucursal;Descripcion Sucursal (Ej 204;Centro)\\
Se pide realizar un script que:\\
* Valide la cantidad de campos del archivo SALDOSCA.DAT, los registros erroneos dejarlos en SALDOSCA.ERR, utilizar como criterio para la validación que en cada registro no exista un cuarto campo.
* Valide también que el Codigo de Sucursal de cada registro del archivo de saldos exista en el de sucursales, sino es así enviar el registro a SALDOSCA.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 //cod.suc - desc suc// Total Saldos = //Sumatoria de saldos de la sucursal//
(Ej. Sucursal 205 - Lomas de Zamora Total Saldos = 505200,5)
* El script invocado sin parámetros solo realizará las validaciones.
Se pide también utilizar al menos una vez el comando **for**.
===== Resolución =====
#!/bin/bash
ARCHIVO_ERR="SALDOSCA.ERR"
ARCHIVO_SALDOS="SALDOSCA.DAT"
ARCHIVO_SUC="sucursales.txt"
ACUMULAR="NO"
SUCURSAL=0
TOTAL=0
#valido parametros
if [ $# -gt 2 -o $# -eq 1 ]
then
echo "cantidad de parámetros incorrecta"
exit 1
fi
if [ $# -eq 2 ]
then
if [ "$1" != "-s" ]
then
echo "parametro desconocido"
exit 2
fi
SUCURSAL="$2"
ACUMULAR="si"
fi
OLD_IFS=$IFS
IFS='
'
for registro in `cat $ARCHIVO_SALDOS`
do
echo "$registro" | grep "^[^;]*;[^;]*;[^;]*$" >> /dev/null
if [ $? -eq 0 ]
then
echo $registro >> $ARCHIVO_ERR
else
C_SUC=`echo "$registro" | cut -d";" -f2`
cat $ARCHIVO_SUCURSALES | grep "^$C_SUC;" >> /dev/null
if [ $? -eq 0 ]
then
echo $registro >> $ARCHIVO_ERR
else
if [ "$ACUMULAR" == "SI" ]
then
SALDO=`echo "$registro" | cut -d";" -f3`
TOTAL=`echo "$TOTAL+$SALDO" | bc -l`
fi
fi
fi
done
if [ "$ACUMULAR" == "SI" ]
then
DESC=`cat $ARCHIVO_SUC | grep "^$SUCURSAL"`
DESC_SUC=`echo "$DESC" | cut -d";" -f2 `
echo "$SUCURSAL _ $DESC_SUC Total Saldos = $TOTAL"
fi
IFS=$OLD_IFS
exit 0
Puede que haya algun que otro error, lo copie rapido y no verifiqué.
== Otra Solucion posible ==
#!/bin/bash
###################################################################################################
# FI.UBA.AR 75.08
# Parcial 20080527_unix - Ejercicio BASH
# Resolucion
# Autor: Maximiliano Milicich (mmilicich)
#
# HIPOTESIS Y PRECONDICIONES:
#
# - Los registros de SALDOSCA.DAT no contienen espacios en blanco
# - Los registros de SALDOSCA.DAT erroneos NO se eliminan del archivo:
# solo se informan en SALDOSCA.ERR
###################################################################################################
PATH=${PATH}:.
ARCH_SALDOS='SALDOSCA.DAT'
ARCH_SUCURS='sucursales.txt'
ARCH_SERROR='SALDOSCA.ERR'
# Validacion de parms de entrada:
if [ $# -gt 0 ] && [ $# -ne 2 -o $1 != '-s' ] ; then
echo -e "$(basename $0) : Sintaxis incorrecta.\n"\
"Uso: $(basename $0) [-s cod_sucursal]"
exit 1
fi
# Validacion de existencia de archivos:
if [ ! -f "$ARCH_SALDOS" ] ; then
echo "$(basename $0) : No se encuentra el archivo de saldos $ARCH_SALDOS"
exit 1
fi
if [ ! -f "$ARCH_SUCURS" ] ; then
echo "$(basename $0) : No se encuentra el archivo de sucursales $ARCH_SUCURS"
exit 1
fi
# Tomamos la sucursal, si nos pasaron una:
if [ -n $2 ] ; then
INPUT_SUC=$2
fi
# Borramos (si existe) el archivo de errores
rm -f $ARCH_SERROR
# Validacion de formato de registros de saldos:
grep '^[^;]*;[^;]*;[^;]*;.*$' $ARCH_SALDOS >> $ARCH_SERROR
# Validacion de sucursal en registros de saldos
# y sumatoria de saldo para la sucursal pedida:
SALDO_TOTAL=0
for REG in $(cat $ARCH_SALDOS) ; do
# Tomamos la sucursal del registro:
SUC=$(echo $REG | cut -d';' -f2)
# Si esta vacia, lo informamos y seguimos con otro registro:
if [ -z $SUC ] ; then
echo $REG 'sucursal vacia' >> $ARCH_SERROR
continue
fi
# Validamos la sucursal contra el maestro de sucursales:
if [ -z "$(grep "^${SUC};.*$" $ARCH_SUCURS)" ] ; then
echo "$REG" >> $ARCH_SERROR
continue
fi
# Si este registro es de la sucursal que nos pidieron,
# acumulamos su saldo en el saldo total:
if [ -n $INPUT_SUC ] && [ $SUC -eq $INPUT_SUC ] ; then
# Tomamos el saldo (reemplazamos coma por punto para el bc):
SALDO=$(echo $REG | cut -d';' -f3 | sed 's/,/\./')
# Sumamos el saldo al Saldo Total acumulado:
SALDO_TOTAL=$(echo "scale=2; $SALDO_TOTAL + $SALDO" | bc)
fi
done # for
# si nos pidieron la sumatoria para la sucursal, la mostramos:
if [ -n $INPUT_SUC ] ; then
# Tomamos el registro de la sucursal pedida:
REG_SUC=$(grep "^${INPUT_SUC};.*$" $ARCH_SUCURS)
# si no existe, lo informamos!
if [ -z "$REG_SUC" ] ; then
echo "Sucursal $INPUT_SUC inexistente en $ARCH_SUCURS"
exit 1
fi
# Obtenemos el nombre de la sucursal:
NOMBRE_SUC=$(echo "$REG_SUC" | cut -d';' -f2)
# Informamos sucursal y saldo total:
echo "Sucursal $INPUT_SUC - $NOMBRE_SUC Total Saldos = $SALDO_TOTAL"
fi
exit 0