====== 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