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
materias/75/08/parcial_20080527_unix.txt · Última modificación: 2009/05/26 00:54 por mmilicich
 
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