====== Examen Parcial - 75.08. Sistemas Operativos ======
**Cátedra:** Osvaldo Clua\\
**Fecha:** Primer Oportunidad \\
**Día:** 26/05/2009\\
**Tema:** Regular Expressions (tema 1)
===== Enunciado =====
Una empresa operadora de telefonia recibe diariamente novedades de un ente llamado ABD que administra la base de datos unificada de los clientes de todas las operadoras.
Las novedades son diferentes tipos de solicitudes de tramites que se deben realizar en el sistema de gestion de clientes propio.
Existe un archivo que relaciona el codigo de novedad informado por el ABD y el tipo de solicitud del sistema propio, puede existir solo una relacion activa.
Se pide realizar un script que reciba como parametro un tipo de solicitud y genere un archivo con las novedades recibidas con el codigo correspondiente a ese tipo.
El archivo de novedades se llama NOVEDADES.dat, el separador de campos es el '+' y posee varios campos. Solo nos interesan los siguientes campos que se encuentran en forma contigua desde el inicio del registro:
* CODIGO_NOVEDAD
* FECHA_DESDE
* FECHA_HASTA
* NRO_LINEA
* OPERADOR_NUEVO
* OPERADOR_VIEJO
* ...
El archivo de relacion se llama TRADUCTOR.info, el separador de campos es el '/' y posee el siguiente formato:
* CODIGO_NOVEDAD
* TIPO_SOLICITUD
* ACTIVO
* FECHA_ULTIMA_MODIFICACION
* ID_ULTIMO_MODIFICADOR
Los valores posibles para el campo ACTIVO son 'S' o 'N'
El archivo de salida debe llamarse NOVEDADES_INBOUND.dat, con ':' como separador de campos y con el siguiente formato:
* TIPO_SOLICITUD
* NRO_LINEA
* OPERADOR_NUEVO
* OPERADOR_VIEJO
* FECHA_DESDE
* FECHA_HASTA
Importante: solo se pueden utilizar los comandos grep y sed. No se permiten expresiones regulares extendidas.
===== Resolución =====
#!/bin/bash
# Autor: Maximiliano Milicich (maximiliano.milicich@gmail.com)
if [ $# -ne 1 ] ; then
echo "$0 : Falta argumento TIPO_SOLICITUD"
exit 1
fi
TIPO_SOL=$1
PATH=${PATH}:.
ARCH_NOV='NOVEDADES.dat'
ARCH_TRAD='TRADUCTOR.info'
ARCH_OUT='NOVEDADES_INBOUND.dat'
COD_NOV=$(grep "^[^/]*/${TIPO_SOL}/S/.*$" $ARCH_TRAD | sed 's@^\([^/]*\)/.*$@\1@')
if [ -z "$COD_NOV" ] ; then
echo "No hay traduccion activa para $TIPO_SOL"
exit 1
fi
sed -n "s/^${COD_NOV}+\([^+]*\)+\([^+]*\)+\([^+]*\)+\([^+]*\)+\([^+]*\)[+]\?.*$/${TIPO_SOL}:\3:\4:\5:\1:\2/p" < "$ARCH_NOV" > "$ARCH_OUT"
# Esta seria otra opcion, usando grep + sed :
# grep "^${COD_NOV}+.*$" $ARCH_NOV | sed "s/^[^+]*+\([^+]*\)+\([^+]*\)+\([^+]*\)+\([^+]*\)+\([^+]*\)[+]\?.*$/${TIPO_SOL}:\3:\4:\5:\1:\2/" > $ARCH_OUT
exit 0
===== Archivos de Ejemplo =====
NOVEDADES.dat
CN0001+2009-01-01+2009-01-10+4824-2890+Juan+Pepe
CN0001+2009-01-01+2009-01-10+4824-2891+Juan+Pepe
CN0001+2009-01-01+2009-01-10+4824-2892+Juan+Pepe
CN0001+2009-01-01+2009-01-10+4824-2893+Juan+Pepe
CN0001+2009-01-01+2009-01-10+4824-2894+Juan+Pepe
CN0001+2009-01-01+2009-01-10+4824-2895+Juan+Pepe
CN0001+2009-01-01+2009-01-10+4824-2896+Juan+Pepe
CN0001+2009-01-01+2009-01-10+4824-2897+Juan+Pepe
CN0001+2009-01-01+2009-01-10+4824-2898+Juan+Pepe
CN0001+2009-01-01+2009-01-10+4824-2899+Juan+Pepe
CN0002+2009-01-01+2009-01-10+4831-8170+Pico+Pala
CN0002+2009-01-01+2009-01-10+4831-8171+Pico+Pala
CN0002+2009-01-01+2009-01-10+4831-8172+Pico+Pala
CN0002+2009-01-01+2009-01-10+4831-8173+Pico+Pala
CN0002+2009-01-01+2009-01-10+4831-8174+Pico+Pala
CN0002+2009-01-01+2009-01-10+4831-8175+Pico+Pala
CN0002+2009-01-01+2009-01-10+4831-8176+Pico+Pala
CN0002+2009-01-01+2009-01-10+4831-8177+Pico+Pala
CN0002+2009-01-01+2009-01-10+4831-8178+Pico+Pala
CN0002+2009-01-01+2009-01-10+4831-8179+Pico+Pala
CN0003+2009-01-01+2009-01-10+4962-1740+Luis+Juan
CN0003+2009-01-01+2009-01-10+4962-1741+Luis+Juan
CN0003+2009-01-01+2009-01-10+4962-1742+Luis+Juan
CN0003+2009-01-01+2009-01-10+4962-1743+Luis+Juan
CN0003+2009-01-01+2009-01-10+4962-1744+Luis+Juan
CN0003+2009-01-01+2009-01-10+4962-1745+Luis+Juan
CN0003+2009-01-01+2009-01-10+4962-1746+Luis+Juan
CN0003+2009-01-01+2009-01-10+4962-1747+Luis+Juan
CN0003+2009-01-01+2009-01-10+4962-1748+Luis+Juan
CN0003+2009-01-01+2009-01-10+4962-1749+Luis+Juan
TRADUCTOR.info
CN0001/TS1000/S/2009-05-01/GAK0053
CN2703/TS3077/N/2009-05-01/GAK0053
CN0002/TS2000/S/2009-05-01/GAK0053
CN0003/TS3000/S/2009-05-01/GAK0053
CN0004/TS4000/S/2009-05-01/GAK0053
CN0005/TS5000/S/2009-05-01/GAK0053
CN2698/TS3079/N/2009-05-01/GAK0053
CN0006/TS6000/S/2009-05-01/GAK0053
CN0007/TS7000/S/2009-05-01/GAK0053
CN0008/TS8000/S/2009-05-01/GAK0053
CN0009/TS9000/S/2009-05-01/GAK0053
CN8694/TS7072/N/2009-05-01/GAK0053