Cátedra: Osvaldo Clua
Fecha: Primer recuperatorio - Segundo Cuatrimestre 2007
Día: 20/11/2007
Tema: Regular Expression
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:
Importante: Solo se pueden utilizar los comandos grep, sed, wc y echo.
#!/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"
#!/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