• Bienvenido

    Este blog nació la madrugada entre el 10 y el 11 de Septiembre de 2007 mientras instalaba Windows y Debian en una máquina que acababa de formatear para comenzar de nuevo.
    Predendo dejar plasmada mi experiencia con todos los 'experimentos' informáticos que llevo a cabo para que cualquiera haga uso de estos conocimientos que a mi me resultan realmente enriquecedores. Colgaré noticias interesantes e iré redactando artículos sobre materias fundamentales en el mundo de la informática como UNIX o Critografía. Mucho Google y mucha Wikipedia
    Comenta lo que quieras en el articulo que mas te haya interesado, cualquier comentario es totalmente bienvenido.
    Un saludo.
    JxXx
  • RSS Mountain Weekends

    • Vietnam: diario de viaje (XIV) agosto 23, 2015
      29/05/2015 19:27 Aeropuerto de HueEstamos en el aeropuerto de Hue esperando para coger el avión que nos va a llevar a Hanoi. Estos 2 últimos días han sido... especiales, diferentes al resto del viaje. El mejor resumen es que nos han intentado timar todo el rato, casi todo el mundo y en varias ocasiones lo han conseguido. Tomándonos una cervecita (Huda) tampo […]
      Juan Sin Miedo
    • Vietnam: diario de viaje (XIII) agosto 23, 2015
      Voy a resumir muchísimo el día de hoy porque tengo muchísimas fotos y porque ya estoy muy cansado. Hemos desayunado fuerte en el hotel y hemos hecho un día de paseo exhaustivo por la zona centro de Hoi An. Lo hemos visto todo y, siento ser así de sincero, hemos acabado hasta los cojones porque todo el mundo nos ha querido vender algo. Si vienes a Hoi An prep […]
      Juan Sin Miedo
    • Vietnam: diario de viaje (XII) agosto 10, 2015
      27/05/2015 21:52Hoy os escribo desde el Vinh Hung 3 Hotel, un hotel bastante próximo a la ciudad antigua de Hoi An en el que hemos decidido dormir dos noches de capricho, tampoco es que sea excesivamente caro pues nos está costando 40$ la noche, pero dentro de lo que hemos visto estos días es bastante lujoso, dentro del edificio, en el patio central ocupándo […]
      Juan Sin Miedo
    • Vietnam: diario de viaje (XI) agosto 10, 2015
      26/05/2015 10:55Estamos en el aeropuerto de Phu Quoc, ya tenemos más o menos organizados los días que nos quedan de vieje, bueno a grandes rasgos, pero eso os lo cuento después, voy a seguir con la historia.Cuando dejé de escribir recogimos y nos montamos en la moto, siguiendo por el camino de la costa oeste hacia el norte y ya en el norte, tras pasar varios […]
      Juan Sin Miedo
    • Vietnam: diario de viaje (X) agosto 10, 2015
      25/05/2015 Entre las 12 y las 13Tras mucho tiempo en moto por media isla hemos dado con un chiringuito y escribo a pocos metros del mar tomándome una Bia Saigon muy fría. Voy a contaros lo de las inmersiones. Con Cristina y el resto de la tripulación de Flipper, una pareja de rusos y una pareja de americanos, Dave y Rachel, que viven y trabajan de profesores […]
      Juan Sin Miedo
    • Vietnam: diario de viaje (IX) agosto 9, 2015
      25/05/15 20:50Debería hacerle una foto al cuaderno para que lo vierais porque la calidad de la carretera era medio buena pero ha habido un momento en el que nos hemos salido a un camino de tierra y he tenido que dejar de escribir porque era imposible. Me he propuesto dedicarle el tiempo que haga falta hasta poner el diario al día, pero antes de continuar qui […]
      Juan Sin Miedo
    • Vietnam: diario de viaje (VIII) agosto 9, 2015
      24/05/15 08:23Como de costumbre, primero os cuento dónde ando y luego sigo contando cosas. Estamos en un autobús rumbo al sur de Phu Quoc, vamos a hacer submarinismo tres parejas y el staff de Flipper. Ayer dejé de escribir para despegar y luego no me apeteció seguir escribiendo y se me va acumulando el trabajo.Tras ver el templo de la literatura decidimos p […]
      Juan Sin Miedo
    • Vietnam: diario de viaje (VII) junio 24, 2015
      23/5/2015 11:37Ayer dejé de escribir porque ya nos íbamos y no me dio tiempo a contar nuestro día por Hanoi, me quedé en que habíamos quedado para cenar. Salimos y estaba lloviendo, pero nos estaba esperando un taxi al que no le hizo mucha gracia nuestro trayecto de poco más de un kilómetro. Nos dejó en la puerta de un bar en el que estaban Alfonso (que tamb […]
      Juan Sin Miedo
    • Vietnam: diario de viaje (VI) junio 16, 2015
      21/5/2015 8:35Estoy hecho polvo, la noche ha sido movida, ha hecho mucho calor pero el aire acondicionado no ha dejado de sonar en ningún momento. A las cinco menos algo hemos llegado a Hanoi, hemos recogido nuestras cosas, nos hemos despedido de Eric (!mierda, no tengo ni su email ni nos hemos hecho una foto con él!) y hemos salido a la estación. Yo estaba […]
      Juan Sin Miedo
    • Vietnam: diario de viaje (V) junio 13, 2015
      Me acabo de subir a una litera y no sé qué tal voy a poder escribir, ¿por dónde iba? A ver, souvenirs, mujeres albinas con gorros rojos, comida picante con arroz y palillos y niños bañándose... ah! un perro pidiendo comida con ojos tristes.  Después de comer seguimos andando y Tsum nos metió en una casa y nos contó un poco la historia de la familia y otras c […]
      Juan Sin Miedo
    • Vietnam: diario de viaje (IV) junio 10, 2015
      19/05/2015 por la mañana tempranoHoy es el cumpleaños de Ho Chi Minh, nacido en 1890, el que fue gobernante y lider de la resistencia contra los poderosos de Vietnam y Estados Unidos. El guía que está en nuestro camarote en el tren nos está contando un montón de datos histñoricos de Vietnam y de Ho Chi Minh, estudió en Rusia y luego volvió a Vietnam y unió a […]
      Juan Sin Miedo
    • Vietnam: diario de viaje (III) junio 6, 2015
      18/05/2015 12:38Imposible escribir… sigo luego en el tren… 18/05/2015 20:57 Estoy tumbado en la litera de arriba de un camarote de un tren de camino a Sapa. El otro día escribí en un autobús camino a la Bahía de Ha-Long y esta mañana he intentado escribir en el autobús de vuelta pero me ha sido imposible. La excursión a la bahía de Ha-Long ha sido espectacul […]
      Juan Sin Miedo
    • Vietnam: diario de viaje (II) junio 3, 2015
      17-05-2015 - 07:46No voy a adelantar desde donde escribo hoy, de momento solo voy a decir que no es un lugar muy cómodo para escribir porque se mueve todo.Bueno, ayer nos bajamos del avión y llovía como si lo fueran a prohibir. Justo antes de salir por la aduana del aeropuerto de Hanoi entregamos los pasaportes, los papeles con nuestros datos, las fotos y la […]
      Juan Sin Miedo
    • Vietnam: diario de viaje (I) junio 2, 2015
      Hoy comienzo a transcribir mi diario de viaje, bueno, nuestro diario de viaje porque aunque ésta vez casi todo lo he escrito yo todo lo que estos días iré publicando, lo que se cuenta en este diario, nos pertenece a los dos. Así empieza éste relato con nuestras aventuras y desventuras, esperamos que os guste y que toméis nota si alguna vez pensáis en viajar […]
      Juan Sin Miedo
    • Expedición al Matterhorn 2014 julio 16, 2014
      Durante la última semana he trascrito el relato de nuestro viaje, relato que he escrito durante las muchísimas horas de coche que supuso el retorno a casa. El relato ha gustado mucho y he recibido mensajes tando de amigos y familiares como de contactos, amigos de amigos, de Facebook, dándome, dándonos, la enhorabuena por la expedición y diciendo que les esta […]
      Juan Sin Miedo
    • Expedición al Matterhorn 2014. EPÍLOGO julio 16, 2014
      Como atestigua el medio cuaderno escrito durante lo que llevamos de vuelta a casa nos han pasado muchas cosas durante este viaje. Los tres volvemos un poco mas viejos, un poco mas sabios y un poco mas amigos. El alpinismo no es sólo llegar a la cumbre, una de las primeras lecciones que se aprenden, alpinismo es disfrutar de un viaje largo y difícil,  de la s […]
      Juan Sin Miedo
    • Expedición al Matterhorn 2014. ESCALAR SOBRE EL MEDITERRANEO julio 16, 2014
      07/07/2014"El séquito se quitó el saquito sequito."Oigo gente paseando, bicicletas también. Es muy temprano y me duele la cabeza, tengo una resaca cojonuda, creo que me pasé con los gin tonics.El lugar que habíamos elegido para dormir la noche anterior no era el mejor, desde luego, estábamos muy cerca de las casas y llamábamos bastante la atención […]
      Juan Sin Miedo
    • Expedición al Matterhorn 2014. DESTINO INCIERTO julio 16, 2014
      06/07/201406:30 - Sigue lloviendo, ¡vaya tela! Me doy la vuelta en el saco y veo que los tres acabamos de abrir los ojos, nos hemos despertado a la vez. Miramos fuera... ¡Joder, sigue lloviendo! "Casi mejor seguir durmiendo" - Pensé. Ninguno dijimos nada pero los tres pensamos lo mismo... Y a las 10 de la mañana dejó de llover y empezó a salir el s […]
      Juan Sin Miedo
    • Expedición al Matterhorn 2014. LAS FIEBRES DEL MONT BLANC julio 15, 2014
      05/07/2014Amaneció lloviendo (¡jooooooooder!) pero a las 10 despejó un poco y empezamos a preparar los macutos muy tranquilamente y las 12:30 o una salimos hacia el pueblo y allí nos comimos un kebab buenísimo antes de coger el teleférico. La estación intermedia estaba nublada, había nubes justo por encima nuestro y no vimos el sol hasta quedarnos a ras de l […]
      Juan Sin Miedo
    • Expedición al Matterhorn 2014. RUMBO A CHAMONIX julio 13, 2014
      04/07/2014Desayunamos muy tranquilamente y sacamos y ordenamos todo, desmontamos la tienda y volvimos a cargar el coche (tetris mode on), pagamos el camping y cogimos carretera hacia Chamonix.En la frontera con Francia nos volvieron a parar. ¿He dicho ya que el coche de Borja es muy cantoso? Nos sacaron del coche y revolvieron todo de muy malas maneras. Nos […]
      Juan Sin Miedo
  • septiembre 2007
    L M X J V S D
        Oct »
     12
    3456789
    10111213141516
    17181920212223
    24252627282930
  • RSS Google: ciencia y tecnología

  • RSS 20 minutos de tecnología

    • Ha ocurrido un error; probablemente el feed está caído. Inténtalo de nuevo más tarde.
  • RSS HISPASEC

    • Ha ocurrido un error; probablemente el feed está caído. Inténtalo de nuevo más tarde.
  • RSS VNUNET

    • Ha ocurrido un error; probablemente el feed está caído. Inténtalo de nuevo más tarde.
  • RSS BarraPunto

Curso de Unix (v)

5. LA HERRAMIENTA AWK

5.1 INTRODUCCION.

awk fue originalmente diseñado e implementado por A.H. Aho, B.W. Kernighan y P.J. Weinberger ( de ahi awk ) en 1977, en parte como un experimento para mostrar como las herramientas UNIX grep y sed podían generalizarse, para trabajar con números ademas de texto. En particular, los autores estaban interesados en expresiones regulares y editores programables. Aunque diseñado para escribir pequeños programas, pronto atrajo a gran numero de programadores, quienes produjeron muchos programas extensos que pusieron de manifiesto las limitaciones de la implementación original. Por eso, en 1985 la versión original fue mejorada.

En su estado actual, awk es un lenguaje tremendamente versátil, que ha sido y es usado para administración de bases de datos, diseño de circuitos, análisis numérico, gráficos, diseño e implementación de compiladores, administración del sistema, lenguaje de entrada para no programadores y cursos de ingeniería de software.

La herramienta awk permite el procesamiento cómodo de archivos de texto. Hace dos cosas:

  • busca patrones de texto en cada línea que se recibe por la entrada estándar

  • se ejecutan un conjunto de acciones para cada patrón que se haya encontrado.

awk.png

El programa awk es diseñado por nosotros y consiste en una serie de patrónes y acciónes asociadas a cada patrón.

 

Patrón1 {acción_es1}
Patrón2 {acción_es2}

Un programa de este tipo puede tener órdenes incompletas:

  • Si falta el patrón, la acción se ejecuta para todas las líneas de texto que entre

  • Si falta la acción, se imprimen por la salida estándar todas las líneas que tengan este patrón. Es igual que ejecutar la orden grep.

Esta herramienta funciona como un filtro. Puede filtrar líneas o campos.

 

5.2 TRATAMIENTO DE LA ENTRADA ESTANDAR EN AWK

Awk considera la entrada estándar como un conjunto sucesivo de líneas y cada línea se considera como un conjunto de campos. Se utilizan delimitadores de esos campos para saber donde empiezan y donde terminan esos campos. El delimitador estándar es el espacio blanco. Para hacer referencia a cada uno de los campos se utiliza $1, $2, $3, … hasta 199 campos diferentes.

Ejemplo: Tenemos un archivo de texto . datos.emp y contiene las siguientes lineas, donde el primer campo es un nombre, el segundo un precio por hora y el tercero el numero de horas trabajadas.

El programa que calcula el sueldo de todo aquel empleado que ha trabajado mas de 0 horas es el siguiente:

awk ‘ $3 > 0 { print $1, $2*$3} ‘ datos.emp

Este programa invoca al intérprete de awk con `awk’, para que ejecute el programa que se le pasa entre comillas, y que tomara la entrada del archivo `datos.emp’. Su salida es la siguiente:

Marcial 13140

Maria 5400

Susana 7350

Los programas awk constan esencialmente de parejas patrón- acción. En el ejemplo que nos ocupa, el patrón lo satisfacen aquellas lineas cuyo tercer campo es mayor que cero, y la acción consiste en imprimir el primer campo, el nombre, y el producto del segundo por el tercero, el sueldo.

Como segundo ejemplo, el programa awk que imprime el nombre de las personas que no han trabajado es el siguiente:

awk ‘ $3 == 0 { print $1}’ datos.emp

y su salida es la siguiente:

Belen
Daniel

Normalmente, es más cómodo usar la sintaxis

awk -f programa entrada

 

donde `programa’ es el fichero con el programa awk que se va a ejecutar y `entrada’ es una lista de uno o varios archivos sobre los que va a actuar el programa. Si se omite esta lista, awk tomara la entrada estandar.

Si el programa awk contiene un error, el interprete avisara del mismo, y no intentara ejecutarlo. Sin embargo, existen errores (p. ej. division por cero) que solo pueden detectarse en tiempo de ejecucion. En este caso, awk detendra el programa y dara un mensaje de error.

5.2.1.- Imprimiendo campos y lineas

Hemos usando antes la instruccion `print $1′, que indica que se imprima el primer campo de la linea. Cuando se omite el argumento de print, se imprime la linea entera. Por defecto, toda linea impresa por awk termina en un caracter `0, y los argumentos de print separados por una coma se imprimen separados por un espacio en blanco, aunque este comportamiento puede cambiarse.

En cuanto a la forma de referirse a los campos, no es obligatorio un digito tras el caracter `$’, sino que puede usarse cualquier expresion que produzca un valor entero.

awk tiene muchas variables internas. Por ejemplo, `NF’ es el numero de campos de cada linea, a medida que estas se leen. Una instruccion legal podria ser entonces:

{print NF, $1, $NF}

Otra de las variables internas de awk es `NR’, que lleva la cuenta de las lineas leidas hasta el momento. Puede usarse para numerar las lineas a la salida. Por ejemplo, el programa

{print NR,$0}

produce la salida

1 Belen 600 0
2 Daniel 500 0
3 Marcial 657 20
4 Maria 450 12
5 Susana 525 14

Ademas de variables, print puede colocar texto. Para ello, se le proporciona como argumento, escribiendolo entre comillas, por ejemplo el programa:

{ print “la paga de “,$1,” es de “,$2*$3,” euros.”}

Normalmente, sobre todo cuando se van a obtener listados largos, deseamos un minimo formato para la salida, de manera que los campos similares aparezcan encolumnados. En el ejemplo que nos esta sirviendo de guia, la salida ganaria mucha legibilidad si el sueldo de cada empleado se imprimiese en la misma columna. Para cubrir estas necesidades se usa la funcion `printf’, cuya sintaxis es igual a la funcion homologa del lenguaje C:

printf formato, valor1, valor2, valor3, …

donde `formato’ es una cadena que contiene texto para ser impreso tal cual e intercaladas en este texto especificaciones sobre como deben imprimirse los valores que van a continuacion. Una especificacion de formato consta del caracter `%’ seguido de algunos caracteres que dependen del tipo de formato en particular que se desea, por ejemplo, `s para cadenas, `f’ para números reales. De esta forma, nuestro primer programa podriamos reescribirlo como:

$3 > 0 { printf “%-8s …. %8.1f euros\n”,$1,$2*$3) } datos.emp

obteniendo la salida

Marcial …. 13140.0 euros
Maria …. 5400.0 euros
Susana …. 7350.0 euros

Aqui, `%-8s’ indica que se va a imprimir una cadena (s), justificada a la izquierda (-) en un campo de 8 caracteres de ancho. El `-8′ es opcional. De la misma forma,`%8.1f’ indica que se imprima un numero real, en un campo de ocho caracteresde ancho, con un decimal.

 

5.3 PATRÓNES EN AWK

La potencia de awk se mide por el tipo de patrones que puedo utilizar.

PATRÓNES SIMPLES

  • Identidad s==t compara si dos cadenas son iguales.
  • Desigualdad s!=t compara si dos cadenas son diferentes.
  • Asignación s=t asigna el valor de s a t
  • Comparación:
    • s<t este tipo de comparaciones también son

    • s>t válidas cuando trabajamos con números

    • s<=t

    • s>=t

  • Inclusión s~t comprueba si la cadena s está incluida en la cadena t

  • No inclusión s!~t comprueba si s no es subcadena de t

EXPRESIONES REGULARES

Van siempre entre / /: /expr/

Cadena Constante: /cad/ busco una cadena constante. Se pueden expresar opciones alternativas: /x|y/: busca x o busca y.

Clase de Caracteres /[..]/

Ejemplo: /[1..9]/

  • X? La interrogación significa que la expresión aparece 0 ó 1 vez.
  • X+ El símbolo de suma significa que la expresión aparece de 1más veces.
  • X* El asterisco significa que la expresión aparece de 0 a n veces.
  • . El punto indica cualquier carácter.
  • .* El punto-asterisco indica cualquier combinación de caracteres.
  • ^X Indica que X aparece al principio de una línea.
  • X$ Indica que X aparece al final de una línea.

PATRÓNES COMPUESTOS

Varios patrónes que siguen una operación lógica.

  • p1 && p2 se tienen que cumplir los dos
  • p1 || p2 se tiene que cumplir uno de los dos
  • !=p2 negación de un patrón.

PATRÓNES DE RANGO

Son patrónes que tienen dos partes:

  • un patrón inicial

  • un patrón final.

Estos patrónes identifican todas las líneas a partir del patrón inicial hasta el patrón final.

Ejemplo, Validación de datos.

Siempre– hay errores en los datos reales, y awk es una excelente herramienta de depuración. La validación es un proceso esencialmente negativo, es decir, se advierte de las lineas que pueden contener datos erróneos, y no se dice nada de las lineas correctas. El siguiente programa muestra como puede usarse awk para validación de datos. Este es un programa de varias lineas, y por tanto no es practico introducirlo desde linea de comandos. Mejor ponerlo en un fichero, p. ej. `valida.awk’, y ejecutarlo mediante `

awk -f valida.awk datos.emp’.

NF != 3 { print $0, “numero de campos distinto de 3” }

$2 < 3.35 { print $0, “precio por hora demasiado bajo” }

$2 > 10 { print $0, “precio por hora demasiado alto” }

$3 < 0 { print $0, “horas trabajadas negativas” }

$3 > 60 { print $0, “demasiadas horas trabajadas” }

 

5.4 VARIABLES EN AWK

Tienen identificadores con un formato concreto: letras, dígitos y subrayado. Lo que caracteriza a las variables de awk es:

  • Nunca hay que declararlas.

  • No tienen tipo.

  • Las variables se inicializan automáticamente con el valor NULL.

  • ASIGNACIÓN

Se utiliza el símbolo =. Ejemplo: hola=7 o _mivar=”hola”

Si las variables son cadenas se admite la operación de concatenación. Por ejemplo: “91”$3 concatenaría el 91 con el campo 3.

  • OPERADORES

    • Numéricos:
      + suma
      – resta
      / división
      * multiplicación.

    • Resto-Módulo %

    • Potencia a^b

    • Autoincremento += x+=7

    • Autodecremento -= x-=7

    • Automúltiplo *= x*=7

    • Autodivisión /= x/=7

    • Incremento ++ x++

    • Decremento — x–

    • Trigonométricas sin, cos, tan

    • Logarítmicas log

    • Exponenciales exp

    • Parte entera int devuelve la parte entera de algo

    • Número Aleatorio rand genera números aleatorios del 0 al 1. Si quiero generar números aleatorios del 0 al 57 hago: rand*57

 

5.5 PATRÓN BEGIN

Es un patrón que se aplica siempre antes de leer la primera línea del primer archivo de entrada.

$awk –F “:” ‘BEGIN {print “lista de usuarios especiales”} $2==””””{print $1}’ /etc/passwd

-F especifica el delimitador de campos. En este ejemplo es el :

Trabajamos sobre los campos de /etc/passwd $2 que es la contraseña y $1 que es el login. Tenemos dos patrónes y dos acciónes:

patrón begin: pone siempre la cabecera “Lista de usuarios Especiales”

$2 ==” “ si la contraseña es una cadena vacía y print $1 escribe el login, por lo tanto escribe los usuarios que no tienen contraseña.

 

5.6 PATRÓN END

Se ejecuta siempre después de leer la última línea del último archivo de emtrada.

$cat lista|awk ‘$1!=””{s+=$2;n++} END&& n>0{print “Valor Medio=” s/n}’

Si el primer campo del archivo lista es distinto de nulo, la variable s toma el valor de $2+s y se incrementa la variable n, contando cuántos cumplen la condición. Cuando n>0 se ejecuta el segundo patrón que consiste en escribir Valor Medio y divida s/n. El archivo lista podría ser un acta de notas.

Una de las mejores caracteristicas de awk es que las variables pueden almacenar indistintamente datos numericos o cadenas de caracteres, y que puede operarse con las cadenas como si fueran números. El siguiente programa imprime el nombre del empleado que mas gana por hora, y el precio por hora.

BEGIN {
maximo = 0
empleado= ” ”
}
$2 > maximo { maximo = $2; empleado=$1 }
END { print empleado ” gana ” maximo}

Aqui la variable `maximo’ es numérica, mientras que `empleado’ es de cadena.

Es posible efectuar concatenaciones de cadenas simplemente escribiéndolas una tras otra, separadas por un espacio en blanco, y asignándolas a otra cadena. Por ejemplo, para formar una cadena que contenga los nombres de todos los empleados,

 

{ nombres = nombres ” ” $1 }

END {print nombres}

5.7 FUNCIONES PREDEFINIDAS

lenght([cad]) devuelve la longitud de la cadena. Si no pasamos una cadena por argumento toma por defecto la cadena $0 que es toda la línea que actualmente se está procesando.

substr(s,m[,n]) devuelve la subcadena de longitud n caracteres tomada de la cadena s a partir de la posición n. Si no indico el argumento n, se toma hasta el final de la cadena.

index(s,t) indica la posición numérica en la cadena s donde aparece la subcadena t. Si no encuentra la subcadena t nos devuelve 0. Sólo devuelve la primera aparición de la subcadena t.

match(s,expr_regular) se busca el lugar de la cadena s donde aparece la expresión regular. Devuelve 0 si no se encuentra.

split(s,a[,fs]) divide la cadena s en elementos delimitados con el separador indicado por fs y mete los resultados en un array a que se llena desde el elemto a[1] en adelante.

system(orden) permite ejecutar una orden o un comando a nivel de sistema operativo devolviendo el código de salida de ese comando.

5.7 SENTENCIAS DE CONTROL EN AWK

  • if (condicion) {acciónes} else {acciónes}]
  • while (condicion) {acciónes} do {acciónes} while(condicion)
  • for(inicialización;prueba;incremento) {acciónes}

Se puede utilizar break para salir de un bucle al nivel inmediatamente exterior y exit que marca el fin de la lectura de entrada.

 

Por ejemplo, para encontrar la media del dinero ganado por aquellos empleados que han trabajado mas de treinta horas:

BEGIN {
n=0
pagado=0
}
$3 > 30 { n=n+1; pagado=pagado+$2*$3}
END {
if (n>0) {
print “numero de empleados: “, n
print “se pago de media : “, pagado/n
}
else
print “ningun empleado trabajo mas de treinta horas.”
}

 

 

5.8 DEFINICION DE FUNCIONES EN AWK

function nombre(lista_param)

{acciónes; return valor}

Existen funciones recursivas:

function factorial(n){
if(n==1)
return 1
else
return n*factorial($1)
}

[0..9]+ {print fact ($1)}

5.9 VARIABLES INTERNAS DE AWK

Están definidas con un valor por defecto.

VARIABLE

NOMBRE

DESCRIPCIÓN

FS

Field Separator

Expresión regular que se utiliza como separador de campos de Entrada.

NF

Number of Fields

Número de campos del regostro actual

NR

Number of Registers

Número de registro o línea actual.

FNR

File Number of Registers

Número de registro en el archivo actual

FILENAME

 

Nombre del archivo actualmente procesado.

RS

Register Separator

Separador de registros de Entrada. Por defecto \n

OFS

Output Field Separator

Separador de campos de Salida. Por defecto es el espacio en blanco.

ORS

Output Register Separator

Separador de registros en la salida. Por defecto es \n

5.10 ENTRADA/SALIDA AVANZADA EN AWK

Todo lo que tiene que ver con la entrada se realiza con la orden getline que tiene el siguiente formato:

getline [var][<fichero]

Esta orden asigna a la variable var el siguiente registro del fichero.

  • Si no se especifica var se toma por defecto $0.

  • Si no indico el fichero se toma por defecto el teclado: /dev/tty o /dev/console dependiendo del sistema Unix.

Esta orden puede devolver tres valores:

  • 1 para indicar que todo ha salido bien

  • 0 para indicar que se ha alcanzado el final de archivo.

  • -1 para indicar que algo ha ido mal.

Normalmente va a formar parte de una acción dentro de un bucle. Todo lo que tiene que ver con la salida se realiza con la orden print que tiene el siguiente formato:

print args [>fichero]

Es obligatorio que los argumentos se impriman en la salida estándar o en el fichero si éste se indica. Los argumentos están separados según el valor de OFS y teminados según el valor de ORS.

Puedo utilizar >>fichero para añadir al final del fichero. Todo lo que se imprima con una orden se puede canalizar a otra orden:

print args|oden2

5.11 UTILIZACIÓN DE ARRAYS EN AWK

Uno de los aspectos mas agradables de awk es la forma de trabajar con arrays. Al igual que para los números y las cadenas, no es preciso declararlos, y el interprete se encarga de todo lo relacionado con el almacenamiento. El siguiente programa usa un array llamado `lineas’ para guardar un archivo completo y luego imprimirlo en orden inverso:

{linea[NR]=$0 # almacena cada linea
}
END {
for(i=NR;i>0;i=i-1){
print linea[i]
}
}

Podemos utilizar arrays unidimensionales o multidimensionales:

Nom_array[indice] -> vector

Nom_array[indice,indice] -> matriz

ARRAYS ASOCIATIVOS

Es un array que tiene dos columnas y que permite utilizar como índice los elementos de la primera columna para acceder a los elementos de la segunda columna.

Ejemplo:

LISTA

Usu18 AbC21
Usu19 asd123
Usu20 sdf234

Si pusiéramos a sentencia $LISTA {“Usu19”} me devolvería la contraseña de Usu19, en este caso asd123. La primera columna debe actuar como campo clave, es decir no debe tener ningún valor repetido.

¿Dudas, sugerencias, recomendaciones?


Saludos.

 

JxXx

2 comentarios

  1. Muy ilustrativo su documento. Gracias por la info.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: