Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Lariscal23 en 6 Diciembre 2021, 19:58 pm



Título: Programación en shell
Publicado por: Lariscal23 en 6 Diciembre 2021, 19:58 pm
Buenas tardes,
Soy nueva es este foro, estoy estudiando Ingeniería Informática, y el profesor de Fundamentos de Informática nos ha mandado un trabajo en el que tenemos que calcular la Información asociada de un texto en un archivo, según la posición que introduzca el usuario.
No tengo ni idea de como hacer ese ejercicio, lo he buscado por internet y no he encontrado nada.
También tengo otro problema, al ejecutar el programa me da un fallo que dice finalización del programa en linea 20, cuando el programa solo tiene 14 lineas de código.
Os agradecería un montón que me ayudarais con esto porfa.
Muchas gracias de antemano.
Un saludo.
Larissa



Título: Re: Programación en shell
Publicado por: Serapis en 6 Diciembre 2021, 20:30 pm
...calcular la Información asociada de un texto en un archivo, según la posición que introduzca el usuario
¿Seguro que es es la descripción que te han dado o el resumen que tú haces...?
Es que es ambigüo, tiene múltiples interpretaciones, y en el mundillo de la programación el enemigo número 2 es la ambigüedad.
Yo podría interpretar (por ejemplo), que dado un punto en un fichero se localice el comienzo y final de una palabra, o de una frase... deduciría esto si estás estudiando por ejemplo operaciones con cadenas... es decir si hay un contexto que puede usarse para resolver la ambigüedad.
Ante las dudas reclama a tu profesor más claridad y detalles.
 
También tengo otro problema, al ejecutar el programa me da un fallo que dice finalización del programa en linea 20, cuando el programa solo tiene 14 lineas de código.
Considera que las líneas en blanco también cuentan.
Sería tremendamente molesto que se diera el índice de una línea de código desechando las línea en blanco, casi que obligaría a uno a contarlas a ver cual es... siendo una posición absoluta basta mirar la línea que se señala.

La mayoría de IDEs enumeran las líneas, en cambio es raro en editores de texto plano, luego en ese caso toca contar.
 


Título: Re: Programación en shell
Publicado por: Lariscal23 en 6 Diciembre 2021, 21:11 pm
Es la descripción del ejercicio que nos ha mandado el profesor, no veo ni una sola pista en internet.
Gracias de antemano.
Larissa Calvo


Título: Re: Programación en shell
Publicado por: Lariscal23 en 6 Diciembre 2021, 21:31 pm
[OPCIÓN 2: Cálculo de información asociada a un mensaje de una fuente de
información.
 Se pedirá el nombre del fichero de la fuente de información por
pantalla.
 Si el fichero no existe se mostrará un mensaje de error y no se hará
nada. Si existe:
• Se pedirá la posición del mensaje del que se quiere calcular la
cantidad de información (por ejemplo, si se indica 3, se va a
calcular la cantidad de información asociada al mensaje cuya
probabilidad está en la línea 3)
• Se buscará la linea que se encuentra en la posición dada
o Si existe esa linea se devolverá la cantidad de
información asociada
o Si no existe esa linea se dará un mensaje de error y se
terminará esta opción.]
Esto es lo que nos ha mandado hacer el profesor.
Esto es lo que tengo yo:
read -p "introduce el nombre del fichero"
if [! -a fichero]
echo "el fichero no existe"
else
echo "Introduce la posicion del mensaje"
read posicion
bc -l probabilidad.bc
var $informacion
$informacion = log (1/posicion) / log 2
echo $informacion
for posicion in linea
do echo posicion
done
Muchas gracias y un saludo 


Título: Re: Programación en shell
Publicado por: Serapis en 7 Diciembre 2021, 01:56 am
Creo que lo que trata de solicitarte es calcular la entropía, de una línea dada de un fichero elegido.
El término 'cantidad de información' es adecuado para referirse a la entropía y pasar de ahí a su cálculo, lo entiendo así cálculo de la entropía. Por eso te preguntaba por el contexto, para confirmar o desestimar, peor tampoco lo has aportado aunque el mensaje es ya lo suficientemente extenso como para interpretarlo en ese sentido.

Se supone que estais estudiando la teoría de la información (la entropía, Claude Shannon, compresión de datos, Huffman)????. Si es así, eso es lo que te pide, que calcules la entropía de la línea de un fichero, como no aclara si el fichero debe ser de texto o no, pero al hablar de líneas se ha de asumir que es un fichero de texto. Considera pués solo los 96 caracteres imprimibles (es decir que los 96 caracteres son equiprobables de aparecer, lógicamente la realidad es distinta, para eso es el cálculo).

Si lo estáis estudiando en estos momentos, lo tendreis fresco, si no puedes repasarlo:
https://es.wikipedia.org/wiki/Entropía_(información)
Por consola no es precisamente la mejor forma de hacer ciertas cosas... pero imagino que como estais empezando, os habrán enseñado lo básico y suficiente para 'ir tirando'.

el pseudocódigo vendría ser esto:

Código:
fichero= Solicitar nombredefichero
Si existe el fichero
   lineapedida = solicitar linea
   mientras no se alcance el final del fichero  
        linea = leer siguientelinea de fichero
        numerolinea = numerolinea +1
        Si numerolinea= lineapedida salimos dle bucle
   repetir
   Si numerolinea <> linea pedida
      informar "Se alcanzó el final del fichero y no se llegó a la linea pedida"
   sino
      calcular entropia de linea
      informar dle valor
   fin si
sino
   informar "no se encuentra el fichero indicado."
fin si

El calculo de la entropía se basa en la probabilidad de aparición y las apariciones reales encontradas. Inicialmente como te digo contamos 96 caracteres imprimibles (se spone un fichero de texto), todas con igual probabilidad luego inicialmente lqa probabilidad de aparición de cada carácter es: 1/96, o lo que e slo mismo en un modelo o´ptimo deberían aparecer 96 caracteres, y todos exactamente una vez. Luego la cantidad de caracteres en la línea tiene su valor y... debes recordar lo que has estudiado y supongo que también quieren poner a prueba como programas los contadores, bucles, condiciones, etc...


Título: Re: Programación en shell
Publicado por: Lariscal23 en 7 Diciembre 2021, 15:06 pm
Muchas gracias, me has salvado el ejercicio. Me gustaría mucho poder volver a contar contigo en caso de que tenga otra duda de programación.
Muchísimas gracias.
Larissa


Título: Re: Programación en shell
Publicado por: Lariscal23 en 11 Diciembre 2021, 13:36 pm
#!/bin/bash
echo "Introduce el nombre del fichero" $fichero
if [test -f "$fichero"] then
echo "Introduce la linea" $line
   while [IFS= read -r $line]
        do
            echo $line;
    bc -l probabilidad.bc
      $informacionAs =$((log($numerolinea) / log 2))
      echo $informacionAs
         done
        if [$line <> IFS] then
          echo "Se alcanzó el final del fichero"
        fi
    done < $fichero
else
   echo "no se encuentra el fichero indicado."
fi
exit

No deja de darme fallos en la linea 14, me dice que quite el fi pero no puedo hacerlo porque es el final de la estructura if ¿que hago?
Muchas gracias de antemano
Larissa calvo


Título: Re: Programación en shell
Publicado por: EdePC en 12 Diciembre 2021, 01:34 am
mmm... primero recomiendo aprendas las instrucciones que vas a utilizar porque tu código esta muy mal XD, mas o menos siguiendo el pseudocódigo de Serapis y tu código sería algo así:

Código
  1. #!/bin/bash
  2. read -p "Introduce el nombre del fichero: " FICHERO
  3. if [[ -f $FICHERO ]] ; then
  4.  read -p "Introduce la linea: " LINEA_PEDIDA
  5.  while IFS= read -r LINEA ; do
  6.    NUMERO_LINEA=$((NUMERO_LINEA + 1))
  7.    if [[ $NUMERO_LINEA == $LINEA_PEDIDA ]]; then
  8.      break
  9.    fi
  10.  done < $FICHERO
  11.  if [[ $NUMERO_LINEA != $LINEA_PEDIDA ]]; then
  12.    echo "Se alcanzo el final del fichero y no se llego a la linea pedida"
  13.  else
  14.    echo "Calculando entropia con la linea $NUMERO_LINEA = $LINEA"
  15.  fi
  16. else
  17.  echo "El archivo $FICHERO no existe"
  18. fi

Yo de la entropía no tengo ni idea XD, no llevé eso en instituto. Pero en caso de Bash puedes revisar unos manuales para guiarte o sino preguntar:

Sesión Nº4: Variables, Alias y Órdenes de Búsqueda
http://www.ugr.es/~benghazi/practica/Sesion4.pdf

Sesión Nº5: Expresiones con variables y expresiones regulares
http://www.ugr.es/~benghazi/practica/Sesion5.pdf

Sesión Nº6: Programación del shell
http://www.ugr.es/~benghazi/practica/Sesion6.pdf

- Supongo que con esas 3 sesiones deberían bastarte para defenderte en el mínimo de Bash


Título: Re: Programación en shell
Publicado por: Lariscal23 en 12 Diciembre 2021, 11:56 am
Muchas gracias por la ayuda, me estaba liando con la entropía, yo tampoco la dí en el instituto.


Título: Re: Programación en shell
Publicado por: informatica123456 en 13 Diciembre 2021, 09:25 am
Buenas, yo tampoco se hacer este ejercicio por si me podíais ayudar. El enunciado es el siguiente:

o OPCIÓN 1: Crear una archivo de fuente de información
 Se pedirá el nombre de fichero por pantalla
 En el caso de que el archivo exista ya se mandará un mensaje de error
y no se hará nada. Si el archivo no existe se creará de la siguiente
manera:
• Se pedirá el número de mensajes que tiene la fuente de
información
• Se pedirán las probabilidades de cada mensaje de una en una
hasta completar el fichero.
Al finalizar la toma de probabilidades, si la suma de las mismas no es
1 se mostrará un mensaje de error y se borrará el fichero.


Título: Re: Programación en shell
Publicado por: Serapis en 13 Diciembre 2021, 18:19 pm
Ya. Pero las respuestas han sido dadas.

Lo único que no se ha detallado es el cálculo de la entropía que debe uno asumir que es justamente lo que estais estudiando y en lo que debeis demostrar que habeis comprendido. Si uno resuelve eso, por vosotros, no mereciríais entonces la nota que os den, pues no os la habríais ganado al resolveros la tarea.

Solo aclararé por si quedan algunas dudas que en todo sistema, la suma de las probabilidades de aparición de cada símbolo (que aparecen en el sistema concreto) debe ser igual a 1, pués es lo mismo que decir la suma de las partes equivalen al todo (obvio, no?).

Inicialmente, por teoría: la frecuencia de aparación de cada símbolo (cáracter) en este caso sería 1/96. Como decía más arriba, si el texto tiene exactamente 96 caracteres y cada uno aparece una sola vez (lo que se llama ideal), entonces cada caracter aparece exactamente 1/96 que multiplicado por 96 (o 1/96 + 1/96... es decir 96 sumas) = 1
El 96 viene de que son 96 los caracteres imprimibles, pués es de asumir que tirais de un fichero de texto. Salvo que el profesor os hubiera indicado expresamente algo como a-z = A-Z... en cuyo caso las 'cuentas' deben cambiar.

Entonces, vuestro trabajo es considerar la cantidad de caracteres que contiene la línea y contar la aparición de cada símbolo-carácter, y así determinar su frecuencia de aparición. La suma luego de todas las probabilidades debe sumar 1 (o 0.9999999 que puede darse por un asunto de falta de precisión). No hagais redondeos en las probabilidades, a lo sumo eliminad lo que exceda de 4 decimales. incluso un valor 0.98 el profesor entenderá que ha sido resuelto... y dirá lo que oportunamente considere respecto de la precisión si lo considera necesario.

Pongo un ejemplo y no diré más:
-------------------------------------------------
Si tengo el texto: "independientemente"
Los símbolos únicos son: i,n,d,e,p,m,t
Cuantas veces aparece cada símbolo?:
i= 2
n= 4
d= 2
e= 6
p= 1
m= 1
t= 2
Cuantas letras hay?: 18
Entonces cual es la probabilidad con que aparece cada carácter?:
i= 2/18 = 0'1111
n= 4/18 = 0'2222
d= 2/18 = 0'1111
e= 6/18 = 0'3333
p= 1/18 = 0'0555
m= 1/18 = 0'0555
t= 2/18 = 0'1111
Cuánto suman las probabilidades?:
0'1111 + 0'2222 + 0'1111 + 0'3333 + 0'0555 + 0'0555 + 0'1111 = 0'9998

Otra cosa aparte es, si os piden cuantos bits se precisan para representar cada simbolo, pero asumo que eso en todo caso sería más adelante si tratais la compresión, aunque quizás paseis por encima de soslayo pues es parte de la teoria de la información, pero sin profundizar. La compresión no deja de ser un tema más profundo y no descarto que algún profesor esté tentado de hacer algún ejercicio simple, relativo a sencillos cálculos.


Relee las respuestas, está prácticamente todo ahí... decir o hacer más, ya supone hacer la tarea.


Releyendo tu mensaje incluso suena (quizás) un poco a pitorreo, puede parecer contradictorio,  quizás porque fue un copy/paste, o por lo menos se presta a 'diferentes' interpretaciones, cómo mínimo están desordenadas las ideas, o se ha manipulado inadecuadamente. Desde luego su redacción queda defectuosa tal como se presenta.

Crear una archivo de fuente de información
 Se pedirá el nombre de fichero por pantalla
 En el caso de que el archivo exista ya se mandará un mensaje de error
y no se hará nada.
Si el archivo no existe se creará de la siguiente
manera:
• Se pedirá el número de mensajes que tiene la fuente de
información
• Se pedirán las probabilidades de cada mensaje de una en una
hasta completar el fichero.
Al finalizar la toma de probabilidades, si la suma de las mismas no es
1 se mostrará un mensaje de error y se borrará el fichero.
Primero dice 'crear' un fichero, pero luego dice que si existe (será si existía uno del mismo nombre previo a crearlo), luego toca solicitar el nombre antes de crearlo.
Si ya existe, es lógico que se utilice (ese mismo) en vez de intentar crear otro, luego el mensaje de error procedente sería algo como: "El fichero ya existe, abriremos ese en vez de crear otro..." , por lo que esa frase de: "...no se hará nada", es de suponer que se refiere a "no se intentará crear otro si ya existe", y por tanto seguir adelante...

Pero luego la siguiente parte del enunciaod dice: "si no existe se creará de la siguiente manera...", que no se detalla (asumo que se puede haber retirado esa parte o que va en distinto orden).
Y al final lo que se espera que se haga con el fichero difiere solo de lo que solicitaba 'Lariscal...', en que en el caso de el/ella, solo se pedía para una determinada línea, y en tu caso se pide para cada línea del fichero, además vas contando las líneas que tiene el mismo porque también se exige.

La diferencia de detalles es tan nimia y simple que uno debiera ser capaz de hacer las ligeras modificaciones de código precisas.


Título: Re: Programación en shell
Publicado por: Hadeva25184 en 31 Enero 2022, 13:37 pm
Hola buenas tardes, quiero meter las distintas líneas de un documento en variables para después trabajar con ellas y no se como se hace. Me podríais ayudar porfa :(


Título: Re: Programación en shell
Publicado por: .xAk. en 3 Febrero 2022, 17:43 pm
quiero meter las distintas líneas de un documento en variables para después trabajar con ellas

sí claro, y cuál es la duda, en principio cada línea es un identificador separado por fin de línea hasta el fin del documento.

Un modo muy sencillo es cambiar la entrada y salida estandar de la shell a un archivo y tratarlo como si fuese la terminal. La salida que esperabas ver en la pantalla irá a parar al archivo.

para leer si no quieres profundizar sobre read, sed y awk son tus amigos.