Awk
De Viquip??dia
El llenguatge de programaci?? awk ??s un llenguatge interpretat especialment dissenyat per al tractament de fitxers de text (o text procedent d'un filtre o pipe). El nom del llenguatge ve de les inicials del cognoms dels seus tres autors originals: Aho, Weinberger i Kernighan; a la pr??ctica el nom es pren pel nom en angl??s de l'alca (un ocell ??rtic), per exemple tal com apareix a la portada del llibre de refer??ncia The AWK Programming Language.
L'awk fa servir strings, expressions regulars (regexp), i arrays associatius (hash). Incorpora tot de conceptes impl??cits com el bucle principal d'entrada, delimitador de camp i delimitador de registre, parsing autom??tic de camps, obrir i tancar fitxers, etc. Aix?? facilita la creaci?? de programes molt compactes d'una sola l??nia.
L'awk ??s l'antecessor directe del perl, i tot i que ??s un llenguatge for??a senzill, resulta molt potent i r??pid per al tractament de fitxers de text. L'int??rpret d'awk demana molt pocs recursos al sistema, i la c??rrega i interpretaci?? del programa ??s m??s r??pida que amb un int??rpret de perl (??s clar que aquest altre pot fer moltes altres coses com accedir a una base de dades o establir connexions de xarxa).
L'awk ??s una utilitat present en qualsevol entorn unix est??ndard. Existeixen implementacions d'awk per a gaireb?? tots els sistemes operatius (unix, linux, ms-windows, hp-mpe, etc). Existeix una versi?? gnu anomenada gawk, que incorpora algunes interessants extensions al llenguatge est??ndard.
Taula de continguts |
[edita] Estructura t??pica d'un programa awk
Un programa awk t??pic ??s una s??rie de regles que especifiquen qu?? cal fer amb el text d'entrada.
Cada regla t??picament ??s una parella de condici?? (opcionalment delimitada entre () o par??ntesis) i d'acci?? (delimitada entre {} o claus). Encara que una regla pot tenir nom??s la condici?? (llavors s'aplica l'acci?? per defecte que ??s llistar el mateix registre de l'entrada a la sortida) o nom??s l'acci?? (llavors s'aplica la condici?? per defecte que ??s aplicar l'acci?? sempre per a tots els registres de l'entrada).
Per exemple:
/hola/ # llista totes les ratlles que contenen "hola"
{ print length($0) } # llista llargada en car??cters de cada ratlla llegida
/hola/ { print length($0) } # llista llargada en car??cters de les ratlles que contenen "hola"
Un programa awk pot incloure regles de dues menes de condicions especials:
- BEGIN: regles que s'apliquen abans de comen??ar a llegir l'entrada
- END: regles que s'apliquen despr??s d'acabar de llegir l'entrada
Per exemple:
/hola/ { quantes++ } # compta ratlles que contenen "hola" END { print 0+quantes } # llista el comptador al final
[edita] Sintaxi
El format del codi awk ??s for??a lliure.
Cada sent??ncia ve separada en una ratlla (ratlles cabades en \n (salt de l??nia). Per partir una sent??ncia llarga i continuar-la en una altra ratlla cal acabar la ratlla partida amb un car??cter \ (antibarra o backslash). Per incloure m??s d'una sent??ncia en una mateixa ratlla, es poden separar amb ; (punt-i-coma). El text a la dreta d'un # (sostingut o hash) es considera un comentari i ??s ignorat per l'int??rpret.
[edita] Tipus de dades, constants i variables, expressions
- ...
- ... constants num??riques
- El text d'una constant string est?? delimitat entre "" (dobles cometes).
- El text d'una constant expressi?? regular est?? delimitat entre // (barres).
- ... variables predefinides
[edita] Estructures de control i subprogrames
- ...
- assignaci??
- sent??ncia composta {...}
- crida a funci??
- function ...(...); return
- if(...) {...} else {...}
- cicle de lectura impl??cit; next; exit
- while() {...}
- do {...} while ()
- for(...;...;...) {...}
- for (... in ...) {...}
- continue, break
[edita] Entrada i sortida
- ...
- entrada implicita
- getline explicit
- system()
- operadors de redirecci??: < > |
[edita] Operacions predefinides
- ...
- operadors d'assignaci??: = += -=
- operadors l??gics: && || !
- operadors relacionals: == != <= >= < >
- operadors num??rics: + - * / % ++ --
- operacions amb strings: substr(), length(), index(), concatenaci?? impl??cita, sprintf(), toupper(), tolower()
- operacions amb dates: time(), strftime()
- operacions amb expressions regulars: ~, !~, match(), sub(), gsub(), split()
- operacions amb arrays associatius: in, delete
[edita] Programes d'exemple
Programa que escriu Hola M??n per la sortida est??ndard.
#!/usr/bin/awk -f BEGIN { print "Hola, m??n!" # salt de linia implicit exit }
Cal destacar que la primera l??nia inclou la ubicaci?? del binari gawk, que pot variar segons el sistema operatiu, o la seva configuraci??.
[edita] Calcular freq????ncia de les paraules d'un text
Una versi?? simple, fent servir un array associatiu:
BEGIN { FS="[^a-zA-Z??????????????????????????????????????????]+" } { for (i=1; i<=NF; i++) paraules[tolower($i)]++ } END { for (i in paraules) print i, paraules[i] }
El bloc BEGIN (que s'interpreta abans de comen??ar la lectura) determina com a delimitador de camp (variable predefinida FS) qualsevol seq????ncia de car??cters que no formin paraules (enumerem els car??cters que formen paraules en catal??). Els delimitadors de camp poden ser expressions regulars, no nom??s strings literals.
Despr??s, posem l'acci?? que cal fer sobre cada l??nia d'entrada (cicle d'entrada impl??cit). En concret, per cada camp (en aquest cas ser?? cada paraula delimitada), comptem quantes vegades apareix la paraula (despr??s de passar-la a min??scules). La creaci?? de cada element de l'array associatiu, identificat amb la paraula com a clau, tamb?? ??s impl??cita. La variable predefinida NF cont?? autom??ticament el nombre de camps del registre llegit en curs. La sintaxi $i permet referir-se al camp d'ordre i (base 1) del registre llegit en curs.
Finalment, al bloc END (que s'interpreta despr??s de finalitzar la lectura), es llista l'array associatiu: les claus dels elements (les paraules) i els valors associats (els comptadors acumulats de nombre d'ocurr??ncies). L'estructura for (i in paraules) permet iterar sobre totes les claus d'??ndex definides d'un array associatiu (en un ordre indefinit, dependent de la implementaci??).
Llenguatges de programaci?? |
---|
Ada | ALGOL | Assemblador | Awk | Basic| BCPL | C | C++ | C# | Cobol | D | Delphi | Eiffel | Forth | Fortran | Haskell | Java | Lisp | Logo | MAGIC | Mercury | Miranda | Modula-2 | Oberon | Ocaml | Pascal | PHP | Perl | Prolog | Python | Rexx | Ruby | Scala | Smalltalk | Altres llenguatges... |