Examen Parcial - 75.08. Sistemas Operativos

Cátedra: Osvaldo Clua
Fecha: Primer recuperatorio - Segundo Cuatrimestre 2007
Día: 20/11/2007
Tema: Regular Expression

Esta página está incompleta; podés ayudar completando el material.

Enunciado

Una librería desea que desarrollemos un script para listar la cantidad de títulos existentes en el stock con un valor mayor a $987,65 de cada unidad.

Para esto contamos con un archivo llamado StockValorizado.dat del que solo sabemos lo siguiente:

  • Sus campos están separados por el caracter '='
  • El segundo campo contiene el título
  • El tercer campo contiene el valor unitario

Importante: Solo se pueden utilizar los comandos grep, sed, wc y echo.

Resolución

#!/bin/bash
A="StockValorizado.dat"
M="^[^\=]*\=\([^\=]*\)"
M4="$M\=[0-9]\{4,\}.*$"         # Para quedarme con todos los que tiene mas de 4 cifras
Ma="$M\=[0-9]\{3\}.*$"          # Para quedarme con todos los que tiene justo 3 cifras
Ma1="$M\=99.*$"
Ma2="$M\=98[8-9].*$"
Ma3="$M\=987,[7-9].*$"
Ma4="$M\=987,6[6-9].*$"
 
linea=`sed<"$A" -n "s/$M4/\1/p"`
linea2=`sed<"$A" -n "s/$Ma/&/p" | sed -n "s/$Ma1/\1/p"`
linea3=`sed<"$A" -n "s/$Ma/&/p" | sed -n "s/$Ma2/\1/p"`
linea4=`sed<"$A" -n "s/$Ma/&/p" | sed -n "s/$Ma3/\1/p"`
linea5=`sed<"$A" -n "s/$Ma/&/p" | sed -n "s/$Ma4/\1/p"`
 
cantidad=`echo "$linea $linea1 $linea2 $linea3 $linea4 $linea5" | wc -l`
 
echo "$cantidad"
Otra opcion (usando grep y un archivo temporal)
#!/bin/bash
 
###################################################################################################
# FI.UBA.AR 75.08
# Parcial 20081104_1 - Ejercicio REGEX
# Resolucion 
#
# Autor: Maximiliano Milicich (mmilicich)
#
# HIPOTESIS Y PRECONDICIONES:
# - El campo valor_unitario tiene el formato 00000,00 
#     > sin el signo monetario $
#     > separador de decimal , (coma)
#     > no lleva separador de miles 
#     > cantidad variable de digitos enteros (al menos 1 digito: no es valido ,99 para expresar 0,99)
#     > cantidad fija de digitos decimales: 2 (dos)
#     > no puede ser negativo (no lleva signo)
#     > puede tener ceros a la izquierda
#
# - Luego del 3er campo (valor_unitario), pueden venir mas campos o bien terminar el registro ahi
#
###################################################################################################
 
PATH=${PATH}:.
ARCH_DATOS='StockValorizado.dat'
ARCH_TEMP='/tmp/StockValorizado.tmp'
 
# Construimos el filtro:
REGEX_HEAD='^\([^=]*\)=\([^=]*\)=' # son los 2 primeros campos con sus separadores
REGEX_TAIL='=\?.*$' # dice: cerramos opcionalmente con un separador, y luego cualquier cosa hta el final
 
# filtro de 1000 para arriba
grep ${REGEX_HEAD}'0*[1-9][0-9]\{3,\},[0-9]\{2\}'${REGEX_TAIL} $ARCH_DATOS > $ARCH_TEMP
# filtro de 999,99 a 990,00
grep ${REGEX_HEAD}'0*99[0-9],[0-9]\{2\}'${REGEX_TAIL} $ARCH_DATOS >> $ARCH_TEMP
# filtro de 989,99 a 988,00
grep ${REGEX_HEAD}'0*98[8-9],[0-9]\{2\}'${REGEX_TAIL} $ARCH_DATOS >> $ARCH_TEMP
# filtro de 987,99 a 987,70
grep ${REGEX_HEAD}'0*987,[7-9][0-9]'${REGEX_TAIL} $ARCH_DATOS >> $ARCH_TEMP
# filtro de 987,69 a 987,66
grep ${REGEX_HEAD}'0*987,6[6-9]'${REGEX_TAIL} $ARCH_DATOS >> $ARCH_TEMP
 
# Listamos los titulos de los registros filtrados (es el campo 2 de REGEX_HEAD):
LISTADO=$(sed 's/'${REGEX_HEAD}'.*$/\2/' $ARCH_TEMP)
echo "$LISTADO"
echo 
echo 'Total de titulos listados: ' $(echo "$LISTADO" | wc -l)
 
# Borramos archivo temporal y nos vamos
rm $ARCH_TEMP 
 
exit
materias/75/08/parcial_20071120_1regexp.txt · Última modificación: 2009/05/25 20:11 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