Provided by: manpages-pl_20060617-3_all bug

NAZWA

       mawk - jzyk wyszukiwania wzorcow i przetwarzania tekstu

SK/LADNIA

       mawk  [-W opcja] [-F warto] [-v zmn=warto]
             [--] 'tekst programu' [plik...]

       mawk  [-W opcja] [-F warto] [-v zmn=warto]
             [-f plik-programu] [--] [plik...]

OPIS

       mawk jest interpreterem jzyka programowania AWK. Jzyk AWK jest uyteczny
       w dzialaniach na plikach danych, wyszukiwaniu  i  przetwarzaniu  tekstu
       oraz  tworzeniu  prototypow  i  eksperymentowaniu  z algorytmami.  mawk
       implementuje jzyk AWK, jak go zdefiniowali Aho, Kernighan i  Weinberger
       w  ksice  The AWK Programming Language, Addison-Wesley Publishing, 1988
       (dalej wzmiankowanej jako ksika AWK).   mawk  jest  zgodny  z  definicj
       jzyka  AWK  ze standardu Posix 1003.2 (propozycja 11.3), zawierajc nowe
       cechy nie opisane w ksice AWK.  Dodatkowo mawk zawiera nieco rozszerze.

       Program AWK jest sekwencj par  wzorzec  {akcja}  i  definicji  funkcji.
       Krotkie  programy wprowadzane s w wierszu polece, zwykle ujte w ' ', by
       unikn interpretacji ich skladowych przez powlok.  Dlusze  programy  mog
       by  czytane z pliku przy pomocy opcji -f.  dane wejciowe odczytywane  s
       z listy plikow z wiersza polece lub ze standardowego wejcia, gdy  lista
       ta  jest  pusta.   Wejcie  rozbijane  jest  na  rekordy okrelone wedlug
       zmiennej opisujcej separator rekordow, RS (record separator). Pocztkowo
       RS="\n"  a  rekordy  s  tosame z wierszami. Kady z rekordow porownywany
       jest z kadym ze wzorc'ow, a jeli pasuje, wykonywany jest tekst  programu
       dla {akcji}.

OPCJE

       -F warto       ustawia separator pol, FS, na warto.

       -f plik        Tekst  programu  jest  czytany z pliku zamiast z wiersza
                      polece.  Dopuszcza si wielokrotne uycie opcji -f.

       -v zmn=warto   przypisuje warto zmiennej programu zmn.

       --             wskazuje jednoznaczny koniec opcji.

       Powysze opcje bd dostpne w kadej zgodnej  z  Posix  implementacji  AWK.
       Opcje specyficzne dla danej implementacji poprzedzane s przez -W.  mawk
       udostpnia sze takich rozszerze:

       -W version     mawk wypisuje sw  wersj  i  prawa  autorskie  na  stdout
                      (standardowym  wyjciu),  za wkompilowane ograniczenia na
                      stderr (standardowym wyjciu bldow).  Koczy prac z  kodem
                      0.

       -W dump        wypisuje  na  stdout asembleropodobny listing wewntrznej
                      reprezentacji programu i koczy  prac  z  kodem  0  (przy
                      pomylnej kompilacji).

       -W interactive ustawia  niebuforowane  zapisy  na  stdout  i buforowane
                      wierszami  odczyty  z  stdin   (standardowego   wejcia).
                      Rekordy z stdin s wierszami niezalenie od wartoci RS.

       -W exec plik   Tekst  programu  czytany jest z pliku i jest to ostatnia
                      opcja.  Przydatne  na  systemach  obslugujcych  konwencj
                      "liczb magicznych" #!  dla skryptow wykonywalnych.

       -W sprintf=num ustawia   rozmiar  bufora  wewntrznego  sprintf  na  num
                      bajtow. Czstsze  ni  sporadyczne  stosowanie  tej  opcji
                      wskazuje, e mawk powinien zosta zrekompilowany.

       -W posix_space wymusza na mawk, by nie uwaal '\n' za odstp.

       Rozpoznawane  s  krotkie postacie -W[vdiesp], za w niektorych systemach
       -We jest obowizkowe dla uniknicia ogranicze dlugoci wiersza polece.

JZYK AWK

   1. Struktura programu
       Program w jzyku AWK jest sklada si z sekwencji par  wzorzec  {akcja}  i
       definicji funkcji uytkownika.

       Wzorcem moe by:
              BEGIN
              END
              wyraenie
              wyraenie, wyraenie

       Mona  pominc  jeden  z  elementow  z pary wzorzec {akcja}, ale nie oba.
       Jeeli pominito {akcj}, to jest ni domniemane { print }.  Jeeli pominito
       wzorzec,  to  jest on niejawnie dopasowany.  Wzorce BEGIN i END wymagaj
       akcji.

       Instrukcje zakoczone s znakami nowej linii, rednikami  lub  oboma  tymi
       znakami.   Grupy instrukcji, jak akcje czy ciala ptli, lczone s w bloki
       za porednictwem { ... }, jak w C.   Ostatnia  instrukcja  w  bloku  nie
       wymaga   znaku  koczcego.   Puste  wiersza  nie  maj  znaczenia;  pusta
       instrukcja zakoczona jest rednikiem. Dlugie instrukcje mona  kontynuowa
       przy  pomocy  odwrotnego  ukonika  \.   Instrukcj  mona  podzieli midzy
       wiersze  bez  uycia   odwrotnego   ukonika   po   przecinku,   nawiasie
       otwierajcym, &&, ||, do, else, nawiasie zamykajcym instrukcji if, while
       lub  for  oraz  nawiasie  zamykajcym  definicji  funkcji.    Komentarze
       zaczynaj si od # i rozcigaj si do a koca wiersza, cho go nie obejmuj.

       Ponisze instrukcje steruj przeplywem programu wewntrz blokow.

              if ( wyra ) instrukcja

              if ( wyra ) instrukcja else instrukcja

              while ( wyra ) instrukcja

              do instrukcja while ( wyra )

              for ( wyr_opc ; wyr_opc ; wyr_opc ) instrukcja

              for ( zmn in tablica ) instrukcja

              continue

              break

   2. Typy danych, konwersja i por'ownywanie
       Istniej dwa podstawowe typy danych, numeryczny i lacuch znakowy.  Stale
       liczbowe mog by calkowite, jak -2, dziesitne jak  1.08,  lub  podane  w
       notacji   naukowej   jak   -1.1e4   czy   .28E-3.  Wszystkie  liczby  s
       reprezentowane wewntrznie w arytmetyce  zmiennoprzecinkowej.  Wszystkie
       obliczenia rownie s zmiennoprzecinkowe.  Tak wic, na przyklad, wyraenie
       0.2e2 == 20 jest prawd. Prawda reprezentowana jest jako 1.0.

       Stale lacuchowe ujte s w cudzyslowy.

                 "To jest lacuch ze znakiem nowej linii na kocu.\n"

       Lacuchy  znakowe  mog  by  kontynuowane  w  kolejnych  wierszach  dziki
       poprzedzeniu znaku nowej linii odwrotnym ukonikiem (\).  Rozpoznawane s
       nastpujce sekwencje specjalne:

           \\        \
           \"        "
           \a        dzwonek, ascii 7
           \b        backspace, ascii 8
           \t        tabulacja, ascii 9
           \n        znak nowej linii, newline , ascii 10
           \v        tabulacja pionowa, ascii 11
           \f        wysuw strony, formfeed, ascii 12
           \r        powrot karetki, carriage return, ascii 13
           \ddd      1, 2 lub 3 cyfry osemkowe dla ascii ddd
           \xhh      1 lub 2 cyfry szesnastkowe dla ascii hh

       Jeeli odwrotnym ukonikiem  zostanie  poprzedzony  inny  znak,  np.  \c,
       wynikiem  bdzie  sekwencja  rodlowa: \c, tzn.  mawk zignoruje specjalne
       wlaciwoci odwrotnego ukonika.

       Naprawd istniej trzy podstawowe typy  danych;  trzecim  jest  liczba  i
       /lacuch, posiadajcy rownoczenie warto liczbow i warto lacuchow.  Zmienne
       definiowane przez uytkownika pojawiaj si przy pierwszym ich uyciu  i  s
       inicjowane  na  null, typu "liczba i lacuch", majce warto numeryczn 0 a
       lacuchow "".  Nietrywialne dane  typu  liczbowo-lacuchowego  pochodz  z
       wejcia i zwykle przechowywane s w polach (zobacz sekcja 4).

       Typ  wyraenia  okrelany  jest  przez  jego  kontekst.  W razie potrzeby
       wykonywana jest automatyczna konwersja typow. Na przyklad,  wyznaczenie
       wartoci instrukcji

            y = x + 2  ;  z = x  "hello"

       Warto  przechowywana  w zmiennej y otrzyma typ numeryczny.  Jeeli x nie
       jest numeryczne, to warto odczytana z x zostanie skonwertowana na liczb
       przed  dodaniem do 2 i zachowaniem w y.  Warto przechowywana w zmiennej
       z bdzie typu lacuchowego: warto x zostanie  przeksztalcona  na  lacuch,
       jeli  bdzie  to  niezbdne,  i zlczona z "hello". Oczywicie, warto i typ
       przechowywane w x nie zmieniaj si w adnej z tych  konwersji.   Wyraenie
       lacuchowe   przeksztalcane   jest   na   numeryczne  przy  zastosowaniu
       najdluszego swego przedrostka numerycznego  jak  w  atof(3).   Wyraenie
       numeryczne  konwertowane  jest  na lacuch poprzez zastpienie wyra przez
       sprintf(CONVFMT, wyra), chyba e wyra  moe  by  reprezentowane  w  danym
       komputerze  jako dokladna liczba calkowita, wowczas przeksztalcane jest
       na sprintf("%d", wyra).  Sprintf() jest funkcj  wbudowan  AWK,  dublujc
       dzialanie   sprintf(3),  za  CONVFMT  jest  wbudowan  zmienn  uywan  do
       wewntrznej konwersji z liczby na lacuch i inicjowan  na  "%.6g".   Mona
       wymusi  jawn  konwersj  typow:  wyra  ""  jest lacuchowe, a wyra+0 jest
       numeryczne.

       Przy wyliczaniu, wyra1 op-rel wyra2, jeeli oba  operandy  s  numeryczne
       lub  numeryczno-lacuchowe,  to  porownywanie jest numeryczne; jeeli oba
       operandy s lacuchami to  porownywanie  jest  lacuchowe;  jeli  jeden  z
       operandow jest lacuchem, to operand nie-lacuchowy jest przeksztalcany i
       porownywanie jest lacuchowe.  Wynik jest numeryczny, 1 lub 0.

       W kontekstach logicznych, jak if ( wyra ) instrukcja, wartoci  wyraenia
       lacuchowego  jest prawda wtedy i tylko wtedy, gdy nie jest ono lacuchem
       pustym ""; wyrae liczbowych wtedy i tylko wtedy gdy nie  s  numerycznie
       zerem.

   3. Wyraenia regularne
       W  jzyku  AWK rekordy, pola i lacuchy s czsto sprawdzane na dopasowanie
       do  wyraenia  regularnego.   Wyraenia  regularne  umieszczone  s  midzy
       ukonikami, a

            wyra ~ /r/

       jest  wyraeniem  AWK o wartoci 1 jeli wyra "pasuje do" r, co oznacza, e
       pewien podlacuch wyra jest w zestawie lacuchow zdefiniowanych przez  r.
       Jeli   nie   wystpuje  dopasowanie,  to  wyraenie  otrzymuje  warto  0;
       zastpienie ~ operatorem "nie  pasuje",  !~,  odwraca  znaczenia.   Pary
       wzorzec-akcja

               /r/ { akcja }   i   $0 ~ /r/ { akcja }

       s  takie  same,  za  dla  kadego  rekordu  wejciowego  pasujcego  do  r
       wykonywana jest akcja.  Faktycznie, /r/ jest wyraeniem  AWK  rownowanym
       ($0  ~  /r/)  wszdzie z wyjtkiem wystpienia po prawej stronie operatora
       dopasowania lub przekazywania do  funkcji  wbudowanej  oczekujcej  jako
       argumentu wyraenia regularnego.

       AWK  stosuje  rozszerzone wyraenia regularne jak egrep(1).  Metaznakami
       wyrae regularnych, tj. znakami  o  specjalnym  znaczeniu  w  wyraeniach
       regularnych s

             ^ $ . [ ] | ( ) * + ?

       Wyraenia regularne konstruowane s ze znakow jak niej:

              c            dopasowuje dowolny znak nie bdcy metaznakiem c.

              \c           dopasowuje  znak  zdefiniowany przez t sam sekwencj
                           specjaln uywan w stalych lacuchowych  lub  doslowny
                           znak c jeli \c nie jest sekwencj specjaln.

              .            dopasowuje  dowolny  znak  (lcznie ze znakiem nowej
                           linii).

              ^            dopasowuje pocztek lacucha.

              $            dopasowuje koniec lacucha.

              [c1c2c3...]  dopasowuje dowolny znak z klasy c1c2c3... .  Zakres
                           znakow  oznaczany  jest  przez  c1-c2 wewntrz klasy
                           [...].

              [^c1c2c3...] dopasowuje  dowolny  znak  nie  nalecy   do   klasy
                           c1c2c3...

       Wyraenia   regularne  konstruowane  s  z  innych  wyrae  regularnych  w
       nastpujcy sposob:

              r1r2         dopasowuje r1, bezporednio po  ktorym  nastpuje  r2
                           (konkatenacja).

              r1 | r2      dopasowuje r1 lub r2 (alternatywa).

              r*           dopasowuje zero lub wicej wystpie r .

              r+           dopasowuje jedno lub wicej r.

              r?           dopasowuje zero lub jedno r.

              (r)          dopasowuje r, umoliwiajc grupowanie.

       Operatory   wedlug   rosncego   priorytetu:  alternatywa,  konkatenacja
       (zlczenie) i operatory jednoargumentowe (*, + lub ?).

       Na przyklad,

           /^[_a-zA-Z][_a-zA-Z0-9]*$/  i
           /^[-+]?([0-9]+\.?|\.[0-9])[0-9]*([eE][-+]?[0-9]+)?$/

       dopasowuj odpowiednio identyfikatory AWK i stale liczbowe AWK.   Zauwa,
       e kropka . musi by chroniona odwrotnym ukonikiem, by zostala rozpoznana
       jako kropka dziesitna, a nie dopasowanie dowolnego znaku,  a  metaznaki
       wewntrz klas znakow trac swe specjalne znaczenie.

       Po  prawej stronie operatorow ~ lub !~ moe zosta uyte dowolne wyraenie.
       Podobnie,  dowolne  wyraenie  mona  przekaza  do   funkcji   wbudowanej
       oczekujcej   wyraenia  regularnego.   W  razie  potrzeby  zostanie  ono
       przeksztalcone na lacuch,  a  nastpnie  zinterpretowane  jako  wyraenie
       regularne. Na przyklad,

            BEGIN { identifier = "[_a-zA-Z][_a-zA-Z0-9]*" }

            $0 ~ "^" identifier

       wypisuje wszystkie wiersze zaczynajce si od jakiego identyfikatora AWK.

       mawk rozpoznaje puste wyraenie regularne, //, dopasowujce lacuch pusty.
       Zatem pasuje do  niego  dowolny  lacuch  na  pocztku,  kocu  i  pomidzy
       dowolnym znakiem. Na przyklad,

            echo  abc | mawk '{ gsub(//, "X") ; print }'
            XaXbXcX

   4. Rekordy i pola
       Rekordy  czytane  s  po  jednym  na raz, i przechowywane w zmiennej $0.
       Rekord rozbijany jest na  pola,  przechowywane  w  $1,  $2,  ...,  $NF.
       Wbudowana  zmienna  NF  ustawiana  jest  na  liczb  pol,  a  NR i FNR s
       zwikszane o 1.  Pola powyej $NF ustawiane s na "".

       Przypisanie  do  $0  powoduje,  e  pola  i  NF  s  obliczane  ponownie.
       Przypisanie  do  NF  lub  do pola powoduje, e $0 jest ponownie tworzone
       przez zlczenie kolejnych pol separowanych przez  OFS.   Przypisanie  do
       pola  o  indeksie  wikszym  od  NF,  powiksza  NF  i  powoduje  ponowne
       utworzenie $0.

       Dane wejciowe przechowywane w polach s lacuchami, chyba e cale pole  ma
       posta numeryczn a wowczas typ jest liczbowo-lacuchowy.  Na przyklad,

            echo 24 24E |
            mawk '{ print($1>100, $1>"100", $2>100, $2>"100") }'
            0 1 1 1

       $0  i  $2 s lacuchami a $1 jest liczbowo-lacuchowe. Pierwsze porownanie
       jest  numeryczne,  drugie  lacuchowe,  trzecie  lacuchowe   (100   jest
       konwertowane na "100"), i ostatnie lacuchowe.

   5. Wyraenia i operatory
       Skladnia  wyrae  jest  podobna  jak w C. Wyraeniami pierwotnymi s stale
       liczbowe, stale lacuchowe, zmienne, pola, tablice i wywolania  funkcji.
       Identyfikator  zmiennej, tablicy bd funkcji moe by cigiem liter, cyfr i
       znakow podkrelenia, nie rozpoczynajcym si  od  cyfry.   Zmienne  nie  s
       deklarowane; zaistniej przy pierwszym do nich odwolaniu, a inicjowane s
       na null.

       Nowe wyraenia tworzone s  z  uyciem  poniszych,  podanych  w  kolejnoci
       rosncego priorytetu, operatorow:

              przypisanie                =  +=  -=  *=  /=  %=  ^=
              warunkowe                 ?  :
              logiczne or               ||
              logiczne and              &&
              przynaleno do tablicy  in
              dopasowanie               ~   !~
              relacyjne                 <  >   <=  >=  ==  !=
              konkatenacja              (bez specjalnego operatora)
              dodawanie/odejmowanie     +  -
              mnoenie/dzielenie        *  /  %
              jednoargumentowe          +  -
              logiczne not              !
              potgowanie               ^
              inkrementacja/dekr.       ++ -- (zarowno post jak i pre)
              pole                      $

       Przypisanie,  operatory  warunkowe  i potgowanie wi od prawej do lewej;
       pozostale  od lewej do prawej.  Kade  wyraenie  moe  by  umieszczone  w
       nawiasach.

   6. Tablice
       Awk  obsluguje tablice jednowymiarowe. Elementy tablic wskazuje si jako
       tablica[wyra].  Wyra jest przeksztalcane wewntrznie na  typ  lacuchowy,
       wic,  na  przyklad,  A[1]  i A["1"] s tym samym elementem, a faktycznym
       indeksem jest "1".  Tablice indeksowane  lacuchami  zwane  s  tablicami
       asocjacyjnymi  (tablicami przyporzdkowujcymi).  Pierwotnie tablica jest
       pusta; elementy zaistniej przy pierwszym do nich  odwolaniu.   Wyraenie
       wyra  in  tablica  daje  w  wyniku  1  jeeli  istnieje tablica[wyra], w
       przeciwnym razie 0.

       Istnieje posta instrukcji for wykonujca  ptl  po  wszystkich  indeksach
       tablicy.

               for ( zmn in tablica ) instrukcja

       ustawia  zmn na kady z indeksow tablicy i wykonuje instrukcj.  Kolejno,
       w jakiej zmn przechodzi przez indeksy tablicy nie jest zdefiniowana.

       Instrukcja delete tablica[wyra], powoduje usunicie tablica[wyra].  mawk
       obsluguje  rozszerzenie, delete tablica, ktore usuwa wszystkie elementy
       tablicy.

       Tablice  wielowymiarowe  tworzone  s  sztucznie  przez  konkatenacj   z
       zastosowaniem  wbudowanej  zmiennej  SUBSEP.  tablica[wyra1,wyra2] jest
       rownowanikiem  tablica[wyra1  SUBSEP  wyra2].    Sprawdzanie   elementu
       tablicy wielowymiarowej uywa indeksu w nawiasach, jak w

            if ( (i, j) in A )  print A[i, j]

   7. Zmienne wbudowane
       Ponisze  zmienne  s  zmiennymi  wbudowanymi.  S  one  inicjowane  przed
       wykonaniem programu.

              ARGC      liczba argumentow wiersza polece.

              ARGV      tablica argumentow wiersza polece, 0..ARGC-1.

              CONVFMT   format  do  wewntrznej  konwersji  liczb  na  lacuchy,
                        pocztkowo = "%.6g".

              ENVIRON   tablica   zaindeksowana  zmiennymi  rodowiska.  Lacuch
                        rodowiska,   zmn=warto   przechowywany    jest    jako
                        ENVIRON[zmn] = warto.

              FILENAME  nazwa biecego pliku wejciowego.

              FNR       numer biecego rekordu w FILENAME.

              FS        dzieli rekordy na pola jako wyraenie regularne.

              NF        liczba pol biecego rekordu.

              NR        numer   biecego   rekordu   w   calkowitym  strumieniu
                        wejciowym.

              OFMT      format do wydruku liczb; pocztkowo = "%.6g".

              OFS       wstawiane pomidzy polami w wyjciu, pocztkowo = " ".

              ORS       koczy kady z rekordow wyjciowych, pocztkowo = "\n".

              RLENGTH   dlugo ustawiona przez  ostatnie  wywolanie  wbudowanej
                        funkcji match().

              RS        separator rekordow wejciowych, pocztkowo = "\n".

              RSTART    indeks ustawiony przez ostatnie wywolanie match().

              SUBSEP    uywany  do  budowy  indeksow  tablic wielowymiarowych,
                        pocztkowo = "\034".

   8. Funkcje wbudowane
       Funkcje lacuchowe

              gsub(r,s,t)  gsub(r,s)
                     Zastpowanie   globalne   (global   substitution),    kade
                     dopasowanie   wyraenia   regularnego   r   w  zmiennej  t
                     zastpowane  jest  lacuchem  s.   Zwracana   jest   liczba
                     wykonanych zastpie.  Jeeli pominito t, to uywane jest $0.
                     Znak & w lacuchu zastpujcym s zastpowany jest dopasowanym
                     podlacuchem  lacucha  t.   \&  oraz  \\ daj, odpowiednio,
                     doslowne & i \ w lacuchu zastpujcym.

              index(s,t)
                     Jeeli t jest podlacuchem s, to zwracana jest pozycja,  na
                     ktorej  rozpoczyna si t, w przeciwnym razie zwracane jest
                     0.  Pierwszy znak s jest na pozycji 1.

              length(s)
                     Zwraca dlugo lacucha s.

              match(s,r)
                     Zwraca indeks pierwszego najdluszego dopasowania wyraenia
                     regularnego  r  w  lacuchu s.  Zwraca 0 jeli nie wystpuje
                     dopasowanie.  Jako skutek  uboczny,  nastpuje  ustawienie
                     RSTART na zwracan warto.  RLENGTH ustawiane jest na dlugo
                     dopasowania  lub  -1  jeli   brak   dopasowania.    Jeeli
                     dopasowano  lacuch pusty, to RLENGTH ustawiane jest na 0,
                     a zwracane jest 1 jeli dopasowanie bylo  na  pocztku,  za
                     length(s)+1, gdy na kocu lacucha.

              split(s,A,r)  split(s,A)
                     Lacuch  s rozbijany jest na pola przez wyraenie regularne
                     r a pola wpisywane s do tablicy A.  Zwracana jest  liczba
                     pol.  Szczegoly  w  sekcji  11 poniej.  Jeeli pominito r,
                     uywane jest FS.

              sprintf(format,lista-wyra)
                     Zwraca lacuch utworzony z listy-wyrae zgodnie z formatem.
                     Zobacz opis printf() poniej.

              sub(r,s,t)  sub(r,s)
                     Pojedyncze zastpienie. Takie samo, jak gsub(), z wyjtkiem
                     tego, e wykonywane jest co najwyej jedno zastpienie.

              substr(s,i,n)  substr(s,i)
                     Zwraca podlacuch lacucha s, poczynajc  od  indeksu  i,  o
                     dlugoci  n.   Jeli  pominito  n, zwracana jest kocowka s,
                     poczynajc od pozycji i.

              tolower(s)
                     Zwraca   kopi   s   ze    wszystkimi    duymi    literami
                     przeksztalconymi na male.

              toupper(s)
                     Zwraca    kopi    s   ze   wszystkimi   malymi   literami
                     przeksztalconymi na due.

       Funkcje arytmetyczne

              atan2(y,x)     arcus tangens z y/x pomidzy -PI i PI.

              cos(x)         funkcja cosinus, x w radianach.

              exp(x)         funkcja wykladnicza.

              int(x)         zwraca x obcite w stron zera.

              log(x)         logarytm naturalny.

              rand()         zwraca liczb losow midzy zero a jeden.

              sin(x)         funkcja sinus, x w radianach.

              sqrt(x)        zwraca pierwiastek kwadratowy z x.

              srand(wyra)  srand()
                     Inicjuje  ziarenko  generatora  liczb  losowych,   uywajc
                     zegara  jeli  pominito  wyra, i zwraca warto poprzedniego
                     ziarenka  losowego.   mawk   inicjuje   generator   liczb
                     losowych  wedlug  zegara  przy  uruchomieniu,  wic nie ma
                     faktycznej  potrzeby  wywolywania  srand().   Srand(wyra)
                     przydaje si do powtarzania cigow pseudolosowych.

   9. Wejcie i wyjcie
       Istniej dwie instrukcje wyjcia: print i printf.

              print  zapisuje na standardowe wyjcie $0  ORS.

              print wyra1, wyra2, ..., wyran
                     zapisuje  na  standardowe  wyjcie wyra1 OFS wyra2 OFS ...
                     wyran ORS.  Wyraenia numeryczne s konwertowane na lacuchy
                     zgodnie z OFMT.

              printf format, lista-wyra
                     powiela   funkcj   biblioteczn   printf  z  C,  piszc  na
                     standardowe   wyjcie.     Rozpoznawany    jest    komplet
                     specyfikacji  formatow z ANSI C z konwersjami %c, %d, %e,
                     %E, %f, %g, %G, %i,  %o,  %s,  %u,  %x,  %X  i  %%,  oraz
                     kwalifikatorami konwersji h i l.

       Lista  argumentow  print  lub printf moe by opcjonalnie ujta w nawiasy.
       Print  formatuje  liczby  przy  pomocy  OFMT  lub  "%d"  dla  dokladnie
       calkowitych.   "%c"  z  argumentem numerycznym wypisuje odpowiedni znak
       8-bitowy, z  argumentem  lacuchowym  wypisuje  pierwszy  znak  lacucha.
       Wyjcie  print i printf mona przekierowa do pliku lub polecenia dolczajc
       > plik,  >>  plik  lub  |  polecenie  na  kocu  instrukcji  drukowania.
       Przekierowanie   otwiera   plik   lub   polecenie  tylko  raz,  kolejne
       przekierowania dolczane  s  do  ju  otwartego  strumienia.   Zgodnie  z
       konwencj,  mawk  lczy  nazw pliku "/dev/stderr" z stderr, co pozwala na
       przekierowanie  wynikow  print   i   printf   na   standardowe   wyjcie
       diagnostyczne.   mawk  wie  rownie,  odpowiednio, "-" i "/dev/stdout" z
       stdin i stdout, co umoliwia przysylanie tych strumieni do funkcji.

       Funkcja wejcia getline ma nastpujce warianty:

              getline
                     czyta do $0, aktualizuje pola, NF, NR i FNR.

              getline < plik
                     czyta do $0 z pliku, aktualizuje pola i NF.

              getline zmn
                     czyta nastpny rekord do zmiennej zmn,  aktualizuje  NR  i
                     FNR.

              getline zmn < plik
                     czyta nastpny rekord pliku do zmiennej zmn.

              polecenie | getline
                     przesyla  potokiem rekord z polecenia do $0 i aktualizuje
                     pola i NF.

              polecenie | getline zmn
                     przesyla potokiem rekord z polecenia do zmiennej zmn.

       Getline  zwraca  0  na  kocu  pliku,  -1  przy  bldzie,  w  pozostalych
       przypadkach 1.

       Polecenia na kocu potokow wykonywane s przez /bin/sh.

       Funkcja  close(wyra)  zamyka  plik  lub potok skojarzony z wyra.  Close
       zwraca 0 jeeli wyra jest otwartym plikiem,  kod  zakoczenia  jeli  wyra
       jest   poleceniem  potoku,  a  -1  w  pozostalych  przypadkach.   Close
       stosowane jest do ponownego odczytu pliku lub polecenia, upewnienia si,
       e  drugi  koniec  potoku  wyjciowego  jest  zakoczony lub do zachowania
       zasobow plikowych.

       Funkcja fflush(wyra) wymiata plik wyjciowy lub potok skojarzony z wyra.
       Fflush  zwraca  0  jeli  wyra  jest  otwartym  strumieniem wyjciowym, w
       przeciwnym razie -1.  Fflush bez argumentu opronia  stdout.   Fflush  z
       pustym argumentem ("") opronia wszystkie otwarte wyjcia.

       Funkcja  system(wyra)  wykorzystuje  /bin/sh do wykonania wyra i zwraca
       kod  zakoczenia  polecenia  wyra.   Zmiany  tablicy   ENVIRON   nie   s
       przekazywane poleceniom wykonywanym przez system lub potoki.

   10. Funkcje definiowane przez uytkownika
       Funkcja definiowana przez uytkownika ma nastpujc skladni:

           function nazwa( argumenty ) { instrukcje }

       Cialo funkcji moe zawiera instrukcj zwrocenia wartoci (return)

            return opcjonalne-wyra

       Instrukcja   return  nie  jest  wymagana.   Wywolania  funkcji  mog  by
       zagniedane lub rekurencyjne.  Wyraenia przekazywane  s  funkcjom  przez
       warto  a tablice przez wskazanie.  Dodatkowe argumenty slu jako zmienne
       lokalne i s inicjowane na null.  Na przyklad, csplit(s,A) wstawia  kady
       znak s do tablicy A i zwraca dlugo s.

            function csplit(s, A,    n, i)
            {
              n = length(s)
              for( i = 1 ; i <= n ; i++ ) A[i] = substr(s, i, 1)
              return n
            }

       Wstawienie  dodatkowych  odstpow  pomidzy  przekazywanymi parametrami a
       zmiennymi lokalnymi wynika z konwencji.  Do funkcji  mona  odwolywa  si
       przed  ich zdefiniowaniem, ale nazwa funkcji i nawias '(' rozpoczynajcy
       list argumentow musz si styka, by unikn pomylki z konkatenacj.

   11. Podzia/l /lacuch'ow, rekord'ow i plik'ow
       Programy awk uywaj  tego  samego  algorytmu  do  rozbicia  lacuchow  na
       tablice przy pomocy split() i rekordow na pola wedlug FS.  mawk stosuje
       zasadniczo ten sam algorytm przy podziale plikow na rekordy wedlug RS.

       Split(wyra,A,sep) dziala nastpujco:

              (1)    Jeeli pominito sep, to jest on zastpowany przez FS.   Sep
                     moe  by  wyraeniem  lub  wyraeniem regularnym. Jeeli jest
                     wyraeniem typu nie-lacuchowego, to jest przeksztalcane na
                     lacuch.

              (2)    Jeli  sep  =  "  "  (pojedyncza  spacja), to <ODSTP> jest
                     obcinana z pocztku i koca wyra, a sep staje si <ODSTPEM>.
                     mawk    definiuje   <ODSTP>   jako   wyraenie   regularne
                     /[ \t\n]+/.  W przeciwnym  wypadku  sep  traktowany  jest
                     jako wyraenie regularne, z wyjtkiem tego, e metaznaki dla
                     lacucha o dlugoci 1 s ignorowane, np.  split(x, A, "*") i
                     split(x, A, /\*/) s tym samym.

              (3)    Jeeli  wyra  nie  jest  lacuchem,  jest przeksztalcane na
                     lacuch.  Jeeli wyra jest wowczas lacuchem pustym  "",  to
                     split()  zwraca  0  a  A  jest  ustawiane  jako puste.  W
                     przeciwnym razie, wszystkie nienakladajce si, niepuste  i
                     najdlusze  dopasowania  sep  w  wyra, dziel wyra na pola,
                     ktore wpisywane s do A.  Pola s umieszczane w A[1], A[2],
                     ...,  A[n]  a  split()  zwraca n, liczb pol, rown liczbie
                     dopasowa plus jeden.  Dane umieszczone w A  wygldajce  na
                     numeryczne otrzymuj typ liczbowo-lacuchowy.

       Podzial  rekordow  na  pola  dziala  tak  samo, z wyjtkiem tego, i czci
       wpisywane s do $1, $2,..., $NF.  Jeeli $0 jest puste, NF jest ustawiane
       na 0 a wszystkie $i na "".

       mawk dzieli pliki na rekordy przy pomocy tego samego algorytmu, ale z t
       niewielk ronic, i RS jest faktycznie cigiem koczcym a nie  separatorem.
       (ORS te jest faktycznie cigiem koczcym).

              Np., jeeli FS = ":+" a $0 = "a::b:" , to NF = 3 a $1 = "a", $2 =
              "b" i $3  =  "",  ale  jeeli  zawartoci  pliku  wejciowego  jest
              "a::b:", za RS = ":+", to istniej dwa rekordy "a" i "b".

       RS = " " nie ma specjalnego znaczenia.

       Jeeli  FS = "", to mawk rozbija rekord na pojedyncze znaki, i, podobnie
       split(s,A,"") umieszcza poszczegolne znaki s w A.

   12. Rekordy wielowierszowe
       Poniewa mawk interpretuje RS jako wyraenie regularne, obsluga  rekordow
       wielowierszowych  jest  latwa.   Ustawienie  RS  = "\n\n+", powoduje, e
       rekordy rozdzielane s co najmniej jednym pustym wierszem. Jeeli FS =  "
       "  (domylnie),  to  pojedyncze znaki nowej linii, wedlug zasad <ODSTPU>
       powyej, staj si odstpami a pojedyncze znaki nowej linii s  separatorami
       pol.

              Na przyklad, jeli w pliku jest "a b\nc\n\n", RS = "\n\n+" a FS =
              " ", to mamy jeden rekord "a b\nc" z trzema polami  "a",  "b"  i
              "c".   Zmiana FS = "\n", daje dwa pola "a b" i "c"; zmieniajc FS
              = "", otrzymujemy jedno pole identyczne jak rekord.

       Traktowanie wierszy ze  spacjami  lub  tabulacjami  jako  pustych  mona
       uzyska  ustawiajc  RS  = "\n([ \t]*\n)+".  W celu utrzymania zgodnoci z
       innymi implementacjami awk, ustawienie RS = "" daje te same wyniki,  co
       usunicie  pustych  wierszy  z pocztku i koca pliku i okrelanie rekordow
       tak, jakby RS = "\n\n+".   Posix  wymaga,  by  "\n"  zawsze  separowalo
       rekordy  gdy  RS = "" niezalenie od wartoci FS.  mawk nie obsluguje tej
       konwencji, gdy zdefiniowanie "\n" jako <ODSTPU> czyni j zbdn.

       W  wikszoci  przypadkow  zmieniajc   RS   w   celu   obslugi   rekordow
       wielowierszowych,  stosuje si te zmienione na "\n\n" ORS, aby na wyjciu
       zachowa odstpy midzy rekordami.

   13. Wykonywanie programu
       Ta sekcja opisuje kolejno  wykonywania  programu.   Po  pierwsze,  ARGC
       ustawiane jest na calkowit liczb argumentow wiersza polece przekazanych
       do  fazy  wykonania  programu.   ARGV[0]   ustawiane   jest   na   nazw
       interpretera  AWK  a  ARGV[1]  ...   ARGV[ARGC-1] przechowuje pozostale
       argumenty wiersza  polece  z  wyjtkiem  opcji  i  rodla  programu.   Na
       przyklad, dla

            mawk  -f  prog  v=1  A  t=hello  B

       ARGC = 5 oraz ARGV[0] = "mawk", ARGV[1] = "v=1", ARGV[2] = "A", ARGV[3]
       = "t=hello" i ARGV[4] = "B".

       Nastpnie wykonywany jest kolejno kady z blokow  BEGIN.   Jeeli  program
       sklada  si  wylcznie  z blokow BEGIN, to na tym wykonywanie si koczy, w
       przeciwnym razie otwierany jest strumie  wejciowy  i  wykonywanie  jest
       kontynuowane.   Jeeli  ARGC rowna si 1, strumie wejciowy ustawiany jest
       na stdin, w przypadku przeciwnym  w  poszukiwaniu  argumentu  plikowego
       sprawdzane s argumenty wiersza polece ARGV[1] ...  ARGV[ARGC-1].

       Argumenty  wiersza  polece  dziel  si na trzy grupy: argumenty plikowe,
       argumenty  przypisa  i  lacuchy  puste  "".    Przypisanie   ma   posta
       zmn=/lacuch.    Podczas  sprawdzania  ARGV[i]  jako  moliwego  argumentu
       plikowego, jeli jest ono puste to jest pomijane; jeli  jest  argumentem
       typu  przypisania,  odbywa  si  przypisanie  wartoci  zmiennej  zmn a i
       zmienia si na nastpny argument; w pozostalych przypadkach ARGV[i]  jest
       otwierane  jako  wejcie.   Jeeli otwarcie nie powiedzie si, wykonywanie
       programu jest koczone z kodem  2.   Jeeli  aden  z  argumentow  wiersza
       polece  nie  jest  argumentem  plikowym,  to  wejcie  pochodzi z stdin.
       Getline w akcji  BEGIN  otwiera  wejcie.   "-"  jako  argument  plikowy
       oznacza stdin.

       Po  otwarciu  strumienia  wejciowego  kady z rekordow wejcia sprawdzany
       jest z kadym ze wzorc'ow,  a  jeli  pasuje,  to  wykonywana  jest  akcja
       skojarzona  z  danym  wzorcem.   Wzorzec w postaci wyraenia pasuje jeli
       jego wartoci logiczn jest prawda (zobacz  koniec  sekcji  2).   Wzorzec
       BEGIN  zestawiany jest przed rozpoczciem odczytu wejcia, za wzorzec END
       po  przeczytaniu  calego   wejcia.    Wzorzec   zakresu,   wyra1,wyra2,
       dopasowuje  kady  rekord  pomidzy rekordem pasujcym do wyra1 a rekordem
       pasujcym do wyra2 lcznie z nimi.

       Po napotkaniu koca pliku w strumieniu wejciowym, sprawdzane s pozostale
       argumenty  wiersza polece w poszukiwaniu kolejnego argumentu plikowego.
       Jeli taki istnieje, to jest otwierany, w przeciwnym  wypadku  przyjmuje
       si, e zostal dopasowany wzorzec END i wykonywane s wszystkie akcje END.

       W  rozwaanym przykladzie, przypisanie v=1 ma miejsce po wykonaniu akcji
       BEGIN,  a  dana  umieszczona  w  v  otrzymuje  typ  liczbowo-lacuchowy.
       Nastpnie  z  pliku  A  jest czytane wejcie.  Po kocu pliku A, zmienna t
       jest ustawiana na lacuch "hello", a B jest otwierany jako  wejcie.   Po
       osigniciu koca pliku B s wykonywane akcje wzorca END.

       Przebieg  programu  na poziomie wzorzec {akcja} mona zmieni przy pomocy
       instrukcji

            next
            exit  wyra-opcjonalne.

       Instrukcja next powoduje,  e  odczyt  nastpnego  rekordu  wejciowego  i
       ponowne   sprawdzanie   wzorcow,  od  pierwszej  pary  wzorzec  {akcja}
       programu.  Polecenie exit powoduje natychmiastowe wykonanie  akcji  END
       lub  zakoczenie  programu,  jeli  nie  ma  takich  akcji lub jeeli exit
       wystpilo w akcji END.  wyra-opcjonalne ustawia  warto  kodu  zakoczenia
       programu,  chyba  e  zostanie  ona przeslonita przez poniejszy exit lub
       ujawniony potem bld.

PRZYK/LADY

       1. emulacja cat.

            { print }

       2. emulacja wc.

            { chars += length($0) + 1  # dodaje jeden dla \n
              words += NF
            }

            END{ print NR, words, chars }

       3. zliczanie niepowtarzajcych si "faktycznych slow".

            BEGIN { FS = "[^A-Za-z]+" }

            { for(i = 1 ; i <= NF ; i++)  word[$i] = "" }

            END { delete word[""]
                  for ( i in word )  cnt++
                  print cnt
            }

       4. sumowanie drugiego pola kadego rekordu w oparciu o pierwsze pole.

            $1 ~ /credit|gain/ { sum += $2 }
            $1 ~ /debit|loss/  { sum -= $2 }

            END { print sum }

       5. sortowanie pliku, porownywanie lacuchowe

            { line[NR] = $0 "" }  # wymusza typ porownywania: gdyby
                                  # jakie wiersze wygldaly
                                  # na numeryczne

            END {  isort(line, NR)
              for(i = 1 ; i <= NR ; i++) print line[i]
            }

            #sortowanie A[1..n] metod wstawiania
            function isort( A, n,   i, j, hold)
            {
              for( i = 2 ; i <= n ; i++)
              {
                hold = A[j = i]
                while ( A[j-1] > hold )
                { j-- ; A[j+1] = A[j] }
                A[j] = hold
              }
              # w razie potrzeby bdzie utworzony wartownik A[0] = ""
            }

KWESTIE ZGODNOCI

       Posix-owa  1003.2  (propozycja  11.3)  definicja  jzyka  AWK  jest  AWK
       opisanym w ksice AWK z kilkoma rozszerzeniami, jakie pojawily si w nawk
       z SystemVR4. Rozszerzeniami tymi s:

              Nowe funkcje: toupper() i tolower().

              Nowe zmienne: ENVIRON[] i CONVFMT.

              Specyfikacje konwersji w printf() i sprintf() wzite z ANSI C.

              Nowe opcje polecenia:  -v  zmn=warto,  wielokrotne  opcje  -f  i
              opcje charakterystyczne dla implementacji jako argumenty -W.

       Posix-owy  AWK  przetwarza pojedyncze wiersze plikow.  RS mona zmieni z
       "\n" na  inny  pojedynczy  znak,  ale  trudno  jest  znale  jakie  tego
       zastosowanie  --  w  ksice AWK brak odpowiednich przykladow.  Zgodnie z
       konwencj, RS  =  "",  powoduje,  e  jeden  lub  wicej  pustych  wierszy
       rozdziela rekordy, umoliwiajc obslug rekordow wielowierszowych.  Gdy RS
       = "", "\n" jest zawsze separatorem pol, niezalenie od wartoci FS.

       mawk, z kolei, pozwala by RS bylo wyraeniem regularnym.  Pojawiajce  si
       w rekordach "\n" jest traktowane jak odstp, a FS zawsze okrela pola.

       Pozbycie  si  paradygmatu  operowania  pojedynczym  wierszem moe uproci
       niektore programy i czsto poprawi wydajno.  Na  przyklad,  zmienieniony
       przyklad 3 (zobacz powyej),

            BEGIN { RS = "[^A-Za-z]+" }

            { word[ $0 ] = "" }

            END { delete  word[ "" ]
              for( i in word )  cnt++
              print cnt
            }

       zlicza ilo niepowtarzajcych si slow przez traktowanie kadego slowa jako
       rekordu.  Przy plikach rednich rozmiarow mawk  wykonuje  go  dwukrotnie
       szybciej, dziki uproszczonej ptli wewntrznej.

       Poniszy program zastpuje kady z komentarzy w pliku programu C pojedyncz
       spacj,

            BEGIN {
              RS = "/\*([^*]|\*+[^/*])*\*+/"
                       # komentarz jest separatorem rekordow
              ORS = " "
              getline  hold
              }

              { print hold ; hold = $0 }

              END { printf "%s" , hold }

       Buforowanie rekordu jest niezbdne, by  unikn  zakoczenia  ostatniego  z
       rekordow spacj.

       W mawk ponisze wyraenia s rownowane,

            x ~ /a\+b/    x ~ "a\+b"     x ~ "a\\+b"

       Powysze  lacuchy  bd analizowane dwukrotnie: raz jako lacuch i raz jako
       wyraenie regularne. Przy  analizie  lacucha  mawk  ignoruje  stosowanie
       cytowania odwrotnym ukonikiem do znakow nie bdcych znakami specjalnymi,
       zatem \c interpretuje jako \c.  Natomiast ksika  AWK  przychyla  si  do
       tego,  by  \c bylo rozpoznawane jako c, co wymaga podwojonego cytowania
       metaznakow w lacuchach.  Posix wprost  odmawia  zdefiniowania  podanego
       zachowania,  przez  co porednio wymusza na programach muszcych dziala z
       ronymi  wersjami  awk  stosowanie  bardziej  przenonego,   lecz   mniej
       czytelnego, cytowania z uyciem podwojnych odwrotnych ukonikow.

       Posix-owy   AWK   nie   rozpoznaje  "/dev/std{out,err}"  ani  sekwencji
       specjalnej \x hex  w  lacuchach.  W  przeciwiestwie  do  ANSI  C,  mawk
       ogranicza  liczb  cyfr,  jakie  mog wystpowa po \x do dwoch, gdy obecna
       implementacja  obsluguje  tylko  znaki  8-bitowe.    Wbudowane   fflush
       pojawilo  si  po  raz  pierwszy  w ostatnim (1993) awk AT&T wydanym dla
       netlib, i nie jest czci standardu  Posix.  Calociowe  usuwanie  tablicy
       przez delete tablica nie jest czci standardu Posix.

       Posix  jawnie zostawia niezdefiniowane zachowanie si FS = "" i wspomina
       o podziale rekordow na znaki jako moliwej  interpretacji,  ale  obecnie
       takie zastosowanie nie jest przenone midzy implementacjami.

       Na  koniec, sposob w jaki mawk obsluguje przypadki wyjtkowe nie opisane
       w ksice AWK ani w  propozycji  Posix.  Niebezpiecznie  jest  zakladanie
       spojnoci  pomidzy  implementacjami awk, a bezpiecznie przej do nastpnej
       sekcji.

              substr(s, i, n) zwraca  znaki  lacucha  s  o  pozycjach  z  czci
              wspolnej przedzialu zamknitego [1, length(s)] i polotwartego [i,
              i+n).  Gdy cz wspolna jest pusta, zwracany  jest  lacuch  pusty;
              zatem substr("ABC", 1, 0) = "" a substr("ABC", -4, 6) = "A".

              Kady  lacuch,  nawet pusty, pasuje pocztkiem do lacucha pustego,
              wic s ~ // i s ~ "", s zawsze rowne 1, tak jak  match(s,  //)  i
              match(s, "").  Ostanie dwa ustawiaj RLENGTH na 0.

              index(s, t) jest zawsze tym samym, co match(s, t1), gdzie t1, to
              to samo, co t z  cytowanymi  metaznakami.  Std  spojno  z  match
              wymaga,  by  index(s,  "")  zawsze  zwracalo 1.  Rownie warunek:
              index(s,t) != 0 wtedy i tylko  wtedy,  gdy  t  jest  podlacuchem
              lacucha s, wymusza by index("","") = 1.

              Jeeli  getline  napotka  koniec  pliku,  getline  zmn pozostawia
              zmienn zmn bez zmian. Podobnie, w momencie rozpoczcia akcji END,
              wartoci  $0,  pol  i  NF  pozostaj  niezmienione  od  ostatniego
              rekordu.

ZOBACZ TAKE

       egrep(1)

       Aho, Kernighan and Weinberger, The AWK Programming  Language,  Addison-
       Wesley  Publishing,  1988, (ksika AWK), definiuje jzyk, rozpoczynajc si
       samouczkiem a dochodzc  do  wielu  interesujcych  programow  i  wchodzc
       glboko  w  kwestie  projektowania  i  analizy  programow  istotne  przy
       programowaniu w kadym jzyku.

       The GAWK Manual, The Free Software Foundation, 1991, stanowi  podrcznik
       i opis jzyka nie usilujcy sign glbi ksiki AWK. Zaklada, e czytelnik moe
       by  pocztkujcym  programist.  Sekcja  powicona  tablicom  w  AWK   jest
       doskonala. Omawia take wymagania stawiane AWK przez Posix.

B/LDY

       mawk  nie  obsluguje znaku ascii NUL \0 w plikach rodlowych czy plikach
       danych.  Mona wypisa NUL  przy  pomocy  printf  z  %c,  a  w  wejciu  s
       dopuszczalne wszystkie inne znaki 8-bitowe.

       mawk   implementuje   printf()   i   sprintf()   przy   pomocy  funkcji
       bibliotecznych C, printf i sprintf, wic  pelna  zgodno  z  ANSI  wymaga
       biblioteki  ANSI  C.  W praktyce oznacza to, e kwalifikator konwersji h
       moe nie by dostpny.  mawk przejmuje te wszystkie bldy czy  ograniczenia
       tych funkcji.

       Tworcy implementacji jzyka AWK ukazali zgodny brak wyobrani w nazywaniu
       swych programow.

AUTOR

       Mike Brennan (brennan@whidbey.com).

INFORMACJE O T/LUMACZENIU

       Powysze tlumaczenie pochodzi z nieistniejcego ju  Projektu  Tlumaczenia
       Manuali  i  moe nie by aktualne. W razie zauwaenia ronic midzy powyszym
       opisem a rzeczywistym zachowaniem  opisywanego  programu  lub  funkcji,
       prosimy o zapoznanie si z oryginaln (angielsk) wersj strony podrcznika.