viernes, 24 de septiembre de 2010

Lenguajes Scripting

Hola compañeros a continuación les publicaré los programas que realice en los lenguajes scripting: AWK, SHELL y PERL.

AWK
Bueno un programa en el lenguaje AWK, que sencillamente este lenguaje scripting es muy sencillo de utilizar, y me llamó la atención que solo con pocas líneas de código se pueden realizar cosas tan eficaces y rápidas.

EL primer programa que realicé en AWK se llama buscar.awk; este programa lo realice con el fin de buscar datos en un archivo, ya que cotidianamente se pueden tener bases de datos con mucha información, y en las cuales se requiere encontrar una información específica y pues con este programa se pueden buscar datos que contengan algunas letras o números específicamente, por ejemplo se pueden buscar datos en donde se encuentren palabras que lleven el término "es", o también se pueden buscar datos que contengan por ejemplo el número "7".

Bueno, hice dos archivos de texto que contienen columnas con datos, para que al momento de que el programa se ejecutará, me buscará cierta información con ciertos términos y después me los imrpimiera.

Código buscar.awk

#!/usr/bin/awk
/do/ {print $0}
/re/ {print $0}
/es/ {print $0}
/0/ {print $0}


Bueno, los términos encerrados entre //, son los términos que se buscarán en los dos archivos de texto que hice, en los cuales realice tres columnas en cada uno; el print$0, hace que se impriman las líneas en donde se encuentren dichos términos. Y si en vez de escribir print$0, se escribe print$1, entonces se imprimirá la primera columna, pero no toda la columna, si no las filas de la columna, de las cuales se hallen los términos buscados, es decir de la ejecución que hice de este programa, se imprimirán todas las tres columnas, cuyas filas contienen los términos buscados, pero con el print$1 solo se imprimirá la columna uno de esta ejecución, y si fuese print$2, se imprimirá la segunda columna e igualmente si fuese print$3, se imprimirá la tercera columna.

Un dato importante, es que, al tener cada fila, más de un dato de los que se estan buscando, la fila se imprimirá el número de veces, tantos datos se hayan encontrado en ella.

Bueno, aquí coloco la ejecución de este programa y así mismo las imagenes de los archivos de texto que utilice. Y como la imagen lo muestra, para ejecutar el programa buscar.awk se tendrá que escribir en la terminal lo siguiente:

awk -f buscar.awk archivo.txt archivo2.txt


Archivo.txt



Archivo2.txt



Ejecución




SHELL
SHELL es un lenguaje scripting sencillo de entender.
El programa que realice en SHELL se llama eliminar.sh, en sí lo que este programa realiza es eliminar archivos o programas con una extensión en especifico, en este caso con la extensión .txt, pero te los elimina totalmente de la computadora, es decir no los manda a la papelera de reciclaje o Trash. Este programa me agrado hacerlo en este lenguaje ya que fue muy sencillo y no necesite de mucho código.

Bueno, aquí les introduzco el código del programa:

Código eliminar.sh

#!/bin/sh
for a in $(ls *.txt); do
rm $a
echo ""
echo Archivo $a Eliminado
done


Bueno, para comenzar se utilizo el for para que fuese leyendo todos los archivos que tenían la extensión .txt, después se colocó a, que en si viene siendo la variable archivo, es decir todos los archivos .txt. Lo que va dentro del parentesis, es decir (ls *.txt), es la lectura que hace el for.
Si se quieren eliminar archivos .pl, pues solo se colocaría (ls *.pl) y asi con cualquier extensión.
Lo que hace rm $a es ir eliminando cada archivo .txt.
Y echo Archivo $a Eliminado solo muestra los archivos que se han eliminado con la extensión .txt.
El in el do y el done son parte de la sintaxis del for.

Para ejecutar el programa, se escribirá en la terminal, lo siguiente:

./eliminar.sh


Y a continuación les muestro las imagenes, de cuando estaban los archivos.txt y cuando ya fueron eliminados y además la ejecución en la terminal.

Con archivos.txt



Archivos.txt eliminados



Ejecución



Una nota importante, es, que solo se eliminarán los archivos, en este caso .txt que se encuentren en donde yo me encuentre en la terminal, es decir, si en la terminal yo estoy en Documentos, y alli ejecuto el programa, pues solamente se eliminarán los archivos .txt que se encuentren en Documentos.

Realice un segundo programa en SHELL, que a la verdad es igual al programa anterior, solo que en este no se eliminarán los archivos, si no solo se mostrarán y por esta razón le llame mostrar.sh. Puede servir para cuando se tienen demasiados archivos y se quieren encontrar ciertos archivos con especificas extensiones.

Aquí esta el código:

Código mostrar.sh


#!/bin/sh
echo "*Mostrando archivos*"
echo ""
for a in $(ls *.java); do
echo Archivo $a
echo ""
done


En este caso, los archivos que me mostrará el programa al ejecutarse, serán archivos .java.
La sintaxis es la misma que la del programa anterior, solo que aqui se omite el rm, y se muestra echo Archivo $a, que lo que esto hace es ir imprimiendo los archivos .java que se han encontrado. Y el echo "", imprime un espacio (un enter o línea nueva). De la misma manera que en el programa anterior, si se quiere que la terminal te imprima los archivos.cpp, solo se necesita colocar *.cpp en (ls *.java), en vez de *.java.

Para ejecutar el programa, coloquen en la terminal:

./mostrar.sh


Aquí les muestro la imagen de los archivos .java que se encuentran y la ejecución del programa.

Archivos .java



Ejecución




PERL

Perl es un lenguaje Scripting, en el cual no es necesario declarar variables, pero también deja que lo hagas. Su sintaxis es muy sencilla, parecida a la del lenguaje C.

El programa que realice en el lenguaje PERL, se llama ecuacion.pl, el cual resuelve una ecuación de segundo grado. Fue bueno realizar este programa en PERL, ya que se aprende a utilizar funciones matemáticas y además el uso del if.

El código del programa es el siguiente:

Código ecuación.pl


#!/usr/bin/perl
$a;
$b;
$c;
$discr;
$x1;
$x2;
$xr;
$xi;
print "\n*Solucion de la ecuacion de segundo grado*\n\n";
print "Ingrese el valor de a -- > ";
($a = );
print "Ingrese el valor de b -- > ";
($b = );
print "Ingrese el valor de c -- > ";
($c = );

$discr = ($b**2)-4*$a*$c;

if($discr > 0){
print "\nLas dos raices son reales y distintas\n";
$x1 = (-$b + sqrt($discr))/(2*$a);
$x2 = (-$b - sqrt($discr))/(2*$a);
print "x1 = $x1 x2 = $x2\n";
}
if($discr == 0){
print "\nLas dos raices son reales e iguales x1 = x2\n";
$x1 = -$b/(2*$a);
print "x1 = $x1\n";
}
if($discr < 0){
print "\nLas dos raices son complejas conjugadas\n";
$xr = -$b/(2*$a);
$xi = sqrt(-$discr)/(2*$a);
print "xr = $xr xi = $xi\n";
}


Una ecuación de segundo grado se resuelve por la fórmula general que ya todos sabemos. Pero hay tres casos que se pueden dar en la solución de una ecuación de segundo grado. Los tres casos se dan, al resolver el discriminante de la ecuación, el cual se calcula asi, b²-4.a.c.
En la parte del código que dice

print "Ingrese el valor de a -- > ";
($a = );
print "Ingrese el valor de b -- > ";
($b = );
print "Ingrese el valor de c -- > ";
($c = );

se estan pidiendo los tres valores de la ecuación, a, b y c. STDIN, lee el valor que le damos a cada variable, es decir, a las variables $a, $b y $c y después les asigna ese valor.

Y como ya se tienen los valores de las tres variables, ahora si se puede calcular el discriminante, de la siguiente manera, $discr = ($b**2)-4*$a*$c;, en donde ($b**2), hace que el valor de la variable $b, se eleve al cuadrado y la parte 4*$a*$c, es una multiplicación de 4 por el valor de la variable $a por el valor de la variable $b y el resultado de esta multiplicación se le resta a ($b**2); es por eso que entre ($b**2) y 4*$a*$c, se coloca el operador -.

Pero, al evaluarse ya el discriminante, como ya mencione, se pueden dar tres casos.
El primero de ellos, en la parte del código es:

if($discr > 0){
print "\nLas dos raices son reales y distintas\n";
$x1 = (-$b + sqrt($discr))/(2*$a);
$x2 = (-$b - sqrt($discr))/(2*$a);
print "x1 = $x1 x2 = $x2\n";
}

Este nos dice, que si el discrimante fue mayor a cero, entonces nos imprimirá en la terminal que Las dos raíces son reales y distintas y además se evaluarán los resultados de $x1 y $x2 y se imprimirán. Se debe tener cuidado en como se escriben las operaciones, por ejemplo, para una raíz se debe colocar sqrt($variable), en donde $variable, será la variable a la cual se le obtenga la raíz cuadrada. Una multiplicación simplemente es asi, $var1*$var2, donde el operador es *. Una división es $var1/$var2, donde el operador es /. Al colocar un signo a una variable, como en el código, en la parte de -$b, simplemente, se le cambia el signo al valor de la variable $b.
Se debe tener cuidado con los parentesis, al evaluarse alguna operación o fórmula.

El segundo caso que se puede obtener es:

if($discr == 0){
print "\nLas dos raices son reales e iguales x1 = x2\n";
$x1 = -$b/(2*$a);
print "x1 = $x1\n";
}

Aquí nos dice, que si el valor del discriminante es igual a cero, entonces se imprimirá que Las dos raíces son reales e iguales y solo se hará la operación de $x1, ya que $x1 y $x2 son iguales. Y la operación que se raliza es, $x1 = -$b/(2*$a), en donde -$b, es el cambio de signo de el valor de la variable $b, y esto mismo se divide entre el resultado de multiplicar (2*$a). Y luego se imprime el resultado de $x1.
Select files to upload
Select folders to upload
Y la última parte del código que es:

if($discr < 0){
print "\nLas dos raices son complejas conjugadas\n";
$xr = -$b/(2*$a);
$xi = sqrt(-$discr)/(2*$a);
print "xr = $xr xi = $xi\n";
}

Este es el tercer caso, que nos menciona que si el valor del discriminante es menor a cero, entonces se imprimirá que Las dos raíces son complejas conjugadas.
Y se realizan dos operaciones, para obtener las dos raices que son $xr(raíz real) y $xi(raíz imaginaria). Como el discriminante aquí es negativo entonces en $xr = -$b/(2*$a), se omite la raíz del discriminante, porque el resultado de $xr es una raíz real. Y en la fórmula de $xi, si se coloca la raíz del dicriminante, ya que el resultado de $x1, es una raíz imaginaria. Pero hay algo muy importante en la parte de sqrt(-$discr), que es el signo de -, el cual hace que el valor del discriminante, al momento de realizarse su raíz cuadrada, sea positivo, ya que no se podría realizar la operación de una raíz negativa, y es por eso mismo que es una raíz imaginaria.

Pare ejecutar este programa, se colocará en la terminal lo siguiente:


perl ecuacion.pl


Aquí les colocó las imagenes de la ejecución del programa con los tres diferentes casos.

Raíces reales y distintas



Raíces reales e iguales



Raíces complejas conjugadas



Bueno estos son los programas que realice, de antemano espero que hayan entendido la expicación de cada uno de ellos.

Aquí les dejo los links para que puedan descargarlos.

buscar.awk
eliminar.sh
mostrar.sh
ecuacion.pl

Gracias por su atención.

4 comentarios:

Roberto Martinez dijo...

Hola Gemma!, estaba checando tus codigos de perl, y esta muy interesante el de ecuaciones, fijate que algunas veces cuando insertamos el codigo en el blog, los signos < > los toma como si fueran etiquetas, entonces en tu codigo aparece cosa que es por utilizar el en tu codigo, simplemente lo puedes borrar. :)

tambien para decirte que otra forma de obtener el valor es utlizando la funcion chomp te dejo un link de lo que hace.
http://perlmeme.org/howtos/perlfunc/chomp_function.html

Saludos :)

Gemma Tovanche Martínez dijo...

Muchas gracias Roberto, de hecho fijate que lo de la función chomp ya lo habia utilizado, bueno de hecho la maestra lo utilizó en ese programa de la ecuación, y entendi para que funciona, quitandolo y poniendolo y por lo que la maestra dijo, pero muchas gracias de todas maneras.
Y gracias por lo que comentaste de los signos < >, aunque no entendi muy bien lo que mencionaste después de que los toma como etiquetas. Saludos

Elisa dijo...

Muy bien los tres programas. Estas demostrando conceptos muy útiles e importantes de entender. De hecho, con cosas tan fundamentales que en linux ya existen herramientas para esas tareas :) Hay una instrucción grep que hace más o menos lo mismo que tu programa de awk. El uso de expresiones regulares con instrucciones como rm y ls permite la funcionalidad que otorga tu programa en shell. Te pongo los tres puntos por esta entrada.

Elisa dijo...

Sería bueno subir ya-ya el reporte cuatro y pronto también el quinto para que no se amontonen.

Publicar un comentario