Cátedra: Osvaldo Clua
Fecha: Primera oportunidad
Día: 27/05/2008
Tema: UNIX
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:
Sucursal cod.suc - desc suc Total Saldos = Sumatoria de saldos de la sucursal (Ej. Sucursal 205 - Lomas de Zamora Total Saldos = 505200,5)
Se pide también utilizar al menos una vez el comando for.
#!/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é.
#!/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