Problema script modificación en UNIX

soulsville

Hola.

Os expongo el problema:

Tengo un menú que consta de tres opciones:

  1. Modificar alumnos
  2. Modificar titulación
  3. Salir

Existen dos ficheros alumnos y titulaciones que poseen esta estructura respectivamente

-expediente:nombre:apellidos:codTitulacion:notaMedia

-nombreTitulacion:codigoTitulacion:creditos

Bien, dicho esto, hay un par de condiciones: las modificaciones del fichero de alumnos se hacen a partir del expediente, y este campo no se puede modificar.

De momento, he empezado el script así:

#!/bin/sh


#Modificaciones alumnos y titulaciones

while true
do
     echo MENU
     echo 1. Modificar alumno
     echo 2. Modificar titulacion
     echo 3. Salir

 echo Introduce la opcion
 read opcion

 case $opcion in
      1) echo Introduce el expediente
         read exp
 
         egrep -w ^$expediente alumnos.txt >> dev/null 
         if [ $? -eq 0 ] // Si encuentra el expediente
         then

         else echo El expediente introducido no existe. 
         fi;;
      3) exit;;
 esac

¿Cómo hago para modificar el campo que quiera? He pensado en hacer un egrep del expediente en alumnos y a partir de ahí hacer un cut, pero tampoco sé muy bien cómo tirar. ¿Cómo lo resolveriáis vosotros? Estoy dando scripts a un nivel bajo, como podéis ver.

Muchas gracias.
vida.

skv

Una forma de hacerlo es:

awk 'BEGIN{FS = ":"}; { if ($1 == "$expediente") {print $1":"$2":"$3":"$4":"$5} else {print $0}}' alumnos.txt > tmp

Donde puedes modificar las columnas que quieras simplemente cambiando $2, $3, $4, $5 por la string que quieras. Esto dejaría el resultado en un fichero temporal tmp, luego tendrias que cambiarle el nombre a alumnos.txt. Es muy probable que haya formas mejores de hacerlo, pero esta funciona y es una linea :D

1
Ulmo

Por lo que dices expediente es clave única, es decir, no se repite, Así q lo puedes substituir directamente con un sed:

sed -i "s/texto_original/texto_substituir/g" fichero

El expediente se supone q ya te lo dan, asi q lo otro viene rodado

nombre=grep expediente fichero | cut -f2 -d:
apellido=grep expediente fichero | cut -f3 -d:
codigo=grep expediente fichero | cut -f4 -d:
nota==grep expediente fichero | cut -f5 -d:

Y con el sed substituyes lo q necesites. Es una forma chapuza, pero es una forma :D

1 1 respuesta
skv

#3 Expediente creo entender que no lo quiere modificar, y los otros datos entiendo que hay que modificarlos sobre el fichero.

Ulmo

Ya, ya, por eso digo q una vez montadas las variables ya puede hacer

sed -i "s/$expediente\:$nombre\:$apellidos\:$titulacion/s/$expediente\:$nombre\:$apellidos\:$nueva_titulacion/g"

fichero.

Es cutre, pero rula y lo substituye directamente del directorio sin tocar el resto de lineas.

1

Usuarios habituales

  • Ulmo
  • skv
  • soulsville