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
materias/75/08/parcial_20090526_1regexp.txt · Última modificación: 2009/06/03 02:21 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