Desktop version

Home arrow Language & Literature

  • Increase font
  • Decrease font


<<   CONTENTS   >>

Otras utilidades de interés

La familiarizacion con las caracterfsticas basicas de las expresiones regulares nos permite simplificar algunas de las tareas que hemos realizado anteriormente у llevar a cabo otras que no nos hemos planteado hasta el momento. Introduciremos para ello dos utilidades adicio- nales: tr у awk.

La orden tr convierte (“traduce”) series de caracteres a series de caracteres. En otras palabras, hace un trabajo parecido al que hemos visto con sed, pero con mas flexibilidad y, sobre todo, con la posibilidad de poner en relacion cada elemento del conjunto de los elementos que hay que sustituir con cada uno de los elementos del conjunto de los que van que van a resultar de la sustitucion. Por ejemplo, si estuvieramos interesados en considerar las frecuencias conjuntas de las variantes en mayusculas у minusculas de las formas de un texto,53 deberfamos hacer la sustitucion de las letras mayusculas por sus equivalentes en minusculas. En las secuencias de procesos que hemos venido haciendo en este capitulo, esa conversion deberfa ser anterior a la primera ordenacion у recuento de casos. Por tanto, algo del estilo de:54

Podemos hacer lo mismo utilizando la referenda a las clases de elementos introducidas al final de apartado anterior:

tr [:upper:] [:lower:] < lista_Ql.txt

Por fin, con esta orden podemos tambien borrar un cierto caracter о una clase de caracteres. Con el ejemplo ya usado de los signos de puntuacion:

tr -d [:punct:] < lista_Ql.txt

Como de costumbre, la orden tr realiza la operacion especificada, pero no conserva el resul- tado. Por tanto, si queremos guardarlo, debemos especificar el lugar en que hay que hacerlo:

tr -d [:punct:] < lista_Ql.txt > otro_fichero. txt

La ultima utilidad que vamos a considerar en este capftulo es awk. En realidad, se trata de un lenguaje de programacion que permite realizar tareas bastante mas complicadas y, por tanto, tiene un grado de complejidad informatica superior al que estamos alcanzando aqui. No obstante, puede ser empleado a un nivel que, aunque elemental, permite obtener de los tex- tos informacion que no se puede conseguir con las que hemos explorado hasta el momento. La forma general de utilizacion de esta orden es:

awk 'patron {accion}' fichero_de_entrada . ext

El contenido de la orden queda delimitado entre comillas simples, el patron es opcional. Si no se incluye patron, se entiende que la orden se refiere a la totalidad del fichero de entrada. Por ejemplo, podemos imprimir todas las lineas de un fichero con la instruccion:

awk '{print}' crea_1000.txt

No se consigue con ella nada distinto de lo que se puede alcanzar con procedimientos que ya conocemos, pero nos sirve para comenzar a trabajar con awk y, de paso, recordar la estructura de fichero, que consta de cuatro campos, separados por tabuladores, en los que aparecen el numero de orden, la forma, la frecuencia total у la frecuencia normalizada (casos por millon) de las mil formas mas frecuentes del CREA. awk entiende, por defecto, que los registros estan delimitados por retornos de carro (es decir, son lineas) у los campos estan separados por tabuladores у espacios en bianco. Es posible trabajar con delimitadores de campos diferentes de los senalados, pero en ese caso hay que indicarlo. Por ejemplo, si el fichero es del tipo campol :campo2:campo3, la orden sera:55

awk -F '{print $0}' fichero_de_entrada.ext.

Podemos tambien obtener, por ejemplo, solo uno de esos campos:

awk '{print $2)' crea_1000.txt

Por supuesto, eso puede conseguirse tambien con, por ejemplo, cut у lo mismo si necesita- mos obtener dos о mas campos. La ventaja de awk esta, en este punto, en que hace posible situar los campos en el orden que mas nos interese, сото vemos en las diez prime- ras lineas resultantes:

awk '{print $3 $2}' crea_1000.txt | head

Free.Forma

  • 9999518de
  • 62775601a
  • 4681839que
  • 4569652el
  • 4234281en
  • 4180279y
  • 3260939a
  • 26186571os
  • 2022514se

En la salida, los dos campos estan pegados, lo cual resulta incomodo para leer у dificultoso para procesar posteriormente. Podemos separarlos con un espacio en bianco anadiendo una coma entre los dos campos:

awk '{print $3,$2}' crea_1000.txt | head

Mas aconsejable para textos сото los que manejamos habitualmente es introducir un tabulador: awk '{print $3 " " $2}' crea_1000.txt | head

Probablemente, la mayor ventaja de awk para nosotros este en la posibilidad de seleccionar la salida en funcion del contenido de alguno(s) de los campos del fichero. La forma basica de conseguirlo es:’6

awk '/120/ {print $0}' crea_1000.txt 79. te 120052 786,92

  • 88. durante 112020 734,27
  • 120. algo 85999 563,71
  • 730. marcha 18427 120,78
  • 731. regimen 18382 120,49
  • 732. consecuencia 18358 120,33
  • 733. conocimiento 18346 120,25
  • 734. corazon 18331 120,15

Como se ve, aparecen lineas en las que la secuencia 120 figura en diferentes campos. Mas о menos lo mismo para recuperar una cierta secuencia de caracteres alfabeticos:

awk '/mente/ {print $0}' crea_1000.txt 596. especialmente 21931 143,75

  • 702. precisamente 18930 124,08
  • 738. finalmente 18231 119,5
  • 944. solamente 14520 95,17

No se consigue, pues, nada que no pudieramos lograr tambien con, por ejemplo, grep. Pero la ventaja de awk viene en tanto que es posible reducir la aparicion del patron a alguno de los campos. Por ejemplo, si queremos recuperar aquellas formas que tienen una frecuencia normalizada (campo 4) de 120, podemos dar la ordenP7

awk '$4~/120/ {print $0}' crea_1000.txt

  • 730. marcha 18427 120,78
  • 731. regimen 18382 120,49
  • 732. consecuencia 18358 120,33
  • 733. conocimiento 18346 120,25
  • 734. corazon 18331 120,15

Como se ve, no figuran las tres primeras lineas del listado anterior, que contienen “120” en campos distintos del cuarto.

Cuando se trabaja con listas de frecuencias puede resultar muy util encontrar aquellas lineas que contengan exactamente una determinada cifra en un campo determinado. Por ejemplo, para recuperar las que tienen una frecuencia total de 18 427:58

awk '$3==18427 {print $0}' crea_1000.txt

730. marcha 18427 120,78

Claro que tambien podemos recuperar las que tienen frecuencia superior (>) о inferior (<) a una determinada cantidad. Si deseamos saber cuantas formas tienen frecuencia superior a 18 000:

awk '$3>18000 {print $0}' crea_1000.txt | wc -1 744

Esto es, damos el patron, imprimimos las lineas correspondientes у reenviamos el resultado a wc, al que pedimos que nos de unicamente el numero de lineas, puesto que no nos interesan ni el de palabras ni el de caracteres.

Es posible establecer mas de una condicion sobre uno о mas campos mediante el operador logico AND:

awk '$3>18000 && $3<18500 {print $0}' crea_1000.txt

727. principales 18490 121,19

728. fernando 18468 121,05

729. metros 18468 121,05

  • 730. marcha 18427 120,78
  • 731. regimen 18382 120,49
  • 732. consecuencia 18358 120,33
  • 733. conocimiento 18346 120,25
  • 734. corazon 18331 120,15

735. campana 18261 119,69

736. estructura 18261 119,69

737. efectos 18253 119,64

738. finalmente 18231 119,5

739. modelo 18221 119,43

  • 740. carta 18218 119,41
  • 741. construccion 18098 118,63
  • 742. medico 18083 118,53
  • 743. miedo 18049 118,3

La referenda a condiciones sobre campos determinados (columnas) tiene especial relevan- cia cuando tenemos que manejar ficheros que contienen informacion mucho mas compleja que la que hemos visto hasta ahora. Por ejemplo, el Corpus de Aprendices de Espanol сото Lengua Extranjera (CAES) proporciona un listado de todos los lemas registrados en el corpus (columna 1), su clase (columna 2), su frecuencia general (columna 3) у las frecuencias parciales correspondientes a los diferentes niveles de dominio de espanol (columnas 4 a 8), у a las diferentes LI de los estudiantes que realizaron las tareas (columnas 9 a 14).59 Por tanto, podriamos recuperar informaciones complejas сото, por ejemplo, los lemas que tienen una frecuencia general igual о superior a una cierta cifra e igual о inferior a otra:60

awk '$3>=1000 && $3<=1200 (print $1,$2,$3}' lista_lemas_caes.txt

ciudad N 1058

decir V 1050

dos D 1036

fumar V 1018

habitacion N 1006

hablar V 1036

lugar N 1013

madre N 1172

о C 1131

otro D 1079

pasar V 1143

tiempo N 1160

tu D 1199

vacacion N 1049

A las condiciones anteriores podemos anadir que pertenezcan a la clase de los sustantivos (clave N en la columna 2):

awk '$3>=1000 && $3<=1200 && $2=="N" {print $1,$2,$3}' lista_ lemas_caes.txt ciudad N 1058 habitacion N 1006 lugar N 1013 madre N 1172 tiempo N 1160 vacacion N 1049

Por ultimo, podemos anadir que la frecuencia entre los estudiantes con nivel A1 tenga frecuencia igual о inferior a 100:

awk '$3>=1000 && $3<=1200 && $2=="N" && $4<=100{print

$1,$2,$3,$4}'

Usando el operador logico de disyuncion podemos recuperar, por ejemplo, los lemas que tengan frecuencia igual о superior a 3000 entre los estudiantes con LI arabe, e igual о superior a 2000 entre los estudiantes con LI portugues:61

awk '($9>=3000 || $13>=2000) {print $1, $2, $9,$13}'

Lema clase Arabe Portugues

a X 2856 2318

de X 5162 5818

el D 10319 9495

en X 4071 3877

mi D 3201 2782

ser V 4405 4349

tener V 2772 2413

un D 3843 3047

у C 6448 5710

Es posible combinar condiciones, usando los parentesis para establecer la prelacion que deseamos. Por ejemplo, para obtener los lemas que tienen una frecuencia igual о superior a 3000 entre los estudiantes con LI arabe, e igual о superior a 2000 entre los estudiantes con LI portugues y, ademas, tienen V сото indicacion de clase:

awk '($9>=3000 || $13>=2000) && $2=="V" {print $1,$2,$9,$13}' lista_lemas_caes.txt ser V 4405 4349 tener V 2772 2413

Aunque awk ofrece, entre muchas otras, la posibilidad de hacer un recuento de las lineas en las que se curnple un cierto conjunto de condiciones, resulta mucho mas sencillo lanzar la orden correspondiente у redirigir su salida hacia wc:

awk ' ($9>=3000 || $13>2000) && $2=="V" {print $1,$2,$9,$13}' lista_lemas_caes.txt | wc -1

2

Por otro lado, awk adrnite tambien la posibilidad de anadir a su nucleo central un bloque de inicio у otro de final. Podrtamos, por ejemplo, incluir una indicacion de la naturaleza del listado antes de emitirlo у complementarlo con un texto que marque su final:

awk 'BEGIN {print "Lista de lemas con F . . . "} ($9>=3000 | |

$13>2000) && $2=="X" {print $1,$2,$9,$13} ENDfprint "Final del listado"}'

a X 2856 2318 de X 5162 5818

en X 4071 3877 Final del listado

Como muestra de la capacidad que tiene awk para procesar la informacion extrai'da, vamos a incluir un ejemplo en el cual se recupera una serie de lfneas que cumplen una determinada condicion у se anade algun calculo adicional. Por ejemplo, si quisieramos comprobar que la frecuencia total de un lema del CAES coincide con la suma de la que presenta en los distin- tos niveles de conocimientos podemos hacerlo calculando la suma de ciertas columnas para cada linea e imprimiendola al lado de valores existentes en el fichero:62

awk '{$20 = ($4+$5+$6+$7+$8) ; print $1,$3,$20}'

zoological 1 1 zootecnista 1 1 zumba 2 2 zumo 4 4 zus 3 3

Todavia mas cerca de lo que se puede conseguir utilizando una base de datos о una hoja de calculo esta la posibilidad de calcular la suma de los valores de un campo determinado en los registros que cumplen una cierta condicion. Por ejemplo, si quisieramos obtener los lemas que incorporan el sufijo -alizar en los lemas del CAES podriamos utilizar la orden siguiente:

awk '$1 ~ /alizar/ { print $l,$3;suma += $3 } END {print "Total

de casos:",suma}' lista_lemas_caes.txt

actualizar 1

analizar 8

contextualizar 1

especializar 12

finalizar 6

focalizar 1

generalizar 1

globalizar 1

localizar 3

marginalizar 1

neutralizar 1

normalizar 1

oficializar 1

paralizar 2

personalizar 1

realizar 111

Total de casos: 152

Se establece en primer lugar la condicion qne debe cumplirse en uno de los campos (que contenga la secuencia -alizar), luego se pide la impresion de uno de los campos у la acumu- lacion de los valores existentes en otro (el tercero) y, finalmente, se imprime un texto у el resultado de la suma que se ha ido realizando sobre los registros seleccionados.

En la misma linea de lograr resultados proximos a los que se pueden obtener usando bases de datos, vamos a calcular los datos del CAES para el numero de sustantivos utilizados en sus tareas por los estudiantes con un determinado nivel de conocimientos, su frecuencia total у la media, lo cual nos permitira comparar los resultados de diferentes grupos lingiifsticos:

awk '$2 == "N" && $4>=1 (casos += 1; frecuencia +=$4} END {print "Casos:",casos" " "Frecuencia total:",frecuencia" "

"Media:", frecuencia/casos}' lista_lemas_caes.txt Casos: 1715 Frecuencia total: 26105 Media: 15.2216 awk '$2 == "N" && $5>=1 {casos += 1; frecuencia +=$5} END {print "Casoscasos" " "Frecuencia total:",frecuencia" "

"Media:", frecuencia/casos}' lista_lemas_caes.txt Casos: 2101 Frecuencia total: 28881 Media: 13.7463 awk '$2 == "N" && $6>=1 {casos += 1; frecuencia +=$6} END {print

"Casoscasos" " "Frecuencia total:",frecuencia" "

"Media:", frecuencia/casos}' lista_lemas_caes.txt Casos: 1898 Frecuencia total: 18139 Media: 9.5569

En primer lugar se establecen las condiciones que deben cumplir los registros que nos inte- resan: la clase del lema debe ser sustantivo (N) у la frecuencia del campo seleccionado igual о superior a uno. La segunda condicion es imprescindible, puesto que, de no anadirla, tomana en cuenta todos los registros de sustantivos. Se establecen luego dos contadores: el primero anade uno a la cuenta cada vez que se encuentra un registro que cumple las condi- ciones especificadas, у el segundo va sumando el contenido de los campos que contienen la frecuencia del nivel correspondiente. Por fin, ya en la zona del END, se escriben los enun- ciados, se anaden los valores obtenidos у se calcula la media (que, naturalmente, es igual al total de las frecuencias partido por el numero de casos).

Como se ha indicado, awk considera que, en el interior de cada registro, los campos estan separados por tabuladores о bien por espacios en bianco. Esta doble posibilidad puede intro- ducir distorsiones en muchos casos, puesto que es bastante comun que las expresiones iden- tificadas consten de mas de una palabra y, en consecuencia, contengan espacios en bianco en el interior de lo que se debe considerar сото un campo unico. Es decir, awk considerarfa en principio que en dos lineas сото

alto A 45 de repente W 20

el segundo campo es A en la primera linea у repente en la segunda. La forma mas comoda de evitar estas distorsiones consiste en indicar un separador especifico, al que ya hemos aludido:

awk -F " " '{print}' fichero_de_entrada. ext

Por otra parte, la salida de awk pega los campos о introduce un espacto en bianco entre ellos si en la orden se separan con una coma. En caso de que sea conveniente que el fichero de salida contenga campos separados por tabuladores (o cualquier otro signo), hay que especifi- carlo. La forma mas comoda, aunque tambien mas pesada, consiste en hacer explicitamente esa indicacion en la orden:65

awk -F " " '{print $1 " " $2 " " $3}' fichero_de_entrada.ext

Como indicacion final, awk admite la indicacion de un caracter о secuencia de caracteres en una posicion determinada de un cierto campo. Por ejemplo, para localizar todas las pal- abras que comienzan por ac en alguno de los ficheros que hemos venido utilizando:

awk -F " " 'substr($2,1,2) == "ac" {print $0}' fichero_de_

entrada.ext

Es decir, se indica el campo al que se refiere la exigencia, la posicion de comienzo у la Ion- gitud de la cadena deseada.

Practices

Localizar en una lista de lemas del CREA о del CORPES:

lemas que comienzan por anti--, lemas que terminan en -miento; lemas que terminan en -alizar.

En una lista de formas (con frecuencias) del CREA о del CORPES, averiguar la frecuencia de los dos miembros de parejas сото:

voleo/boleo

cinc/zinc

video/video

Utilizando las aplicaciones de consulta correspondientes al corpus utilizado, trate de identificar la distribucion de las parejas indicadas en la practice anterior.

En el corpus ESLORA, recupere los casos en los que una forma de primera persona de singular no va acompanada de yo ni en la posicion inmediatamente anterior ni en la inmediatamente posterior.

Recalcular los porcentajes de la tabla 5.5 teniendo en cuenta solo los sustantivos comunes [Ver la lista de lemas del CORPES en http://web.frl.es/CORPES/org/publico/ pages/estad/estad.view у utilizando una hoja de calculo para los porcentajes. En esa lista, se diferencia la clase de los sustantivos comunes (etiqueta N) у la de los nombres propios (etiqueta K)].

 
<<   CONTENTS   >>

Related topics