Tabla de Contenidos

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:

El archivo de relacion se llama TRADUCTOR.info, el separador de campos es el '/' y posee el siguiente formato:

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:

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