]> git.pld-linux.org Git - packages/mawk.git/blob - mawk.1.pl
- initialize some var.
[packages/mawk.git] / mawk.1.pl
1 .\" {PTM/WK/2000-VI}
2 .TH MAWK 1  "22 grudnia 1994" "wersja 1.2" "POLECENIA U¯YTKOWNIKA"
3 .\" strings
4 .ds ex \fIwyra¿\fR
5 .SH NAZWA
6 mawk \- jêzyk wyszukiwania wzorców i przetwarzania tekstu
7 .SH SK£ADNIA
8 .TP 6
9 .B mawk
10 .RB [ -W
11 .IR opcja ]
12 .RB [ -F
13 .IR warto¶æ ]
14 .RB [ -v
15 .IR zmn\fB=\fPwarto¶æ ]
16 .br
17 .RB [ \-\- "] 'tekst programu'"
18 .RI [ plik ...]
19 .TP
20 .B mawk
21 .RB [ -W
22 .IR opcja ]
23 .RB [ -F
24 .IR warto¶æ ]
25 .RB [ -v
26 .IR zmn\fB=\fPwarto¶æ ]
27 .br
28 .RB [ -f
29 .IR plik-programu ]
30 .RB [ \-\- ]
31 .RI [ plik ...]
32 .SH OPIS
33 .B mawk
34 jest interpreterem jêzyka programowania AWK. Jêzyk AWK jest u¿yteczny
35 w dzia³aniach na plikach danych, wyszukiwaniu i przetwarzaniu tekstu oraz
36 tworzeniu prototypów i eksperymentowaniu z algorytmami.
37 .B mawk
38 implementuje jêzyk AWK, jak go zdefiniowali Aho, Kernighan i Weinberger
39 w ksi±¿ce
40 .IR "The AWK Programming Language" ,
41 Addison-Wesley Publishing, 1988 (dalej wzmiankowanej jako ksi±¿ka AWK).
42 .B mawk
43 jest zgodny z definicj± jêzyka AWK ze standardu Posix 1003.2
44 (propozycja 11.3), zawieraj±c± nowe cechy nie opisane w ksi±¿ce AWK.
45 Dodatkowo
46 .B mawk
47 zawiera nieco rozszerzeñ.
48 .PP
49 Program AWK jest sekwencj± par \fIwzorzec {akcja}\fP i definicji funkcji.
50 Krótkie programy wprowadzane s± w wierszu poleceñ, zwykle ujête w ' ', by
51 unikn±æ interpretacji ich sk³adowych przez pow³okê.
52 D³u¿sze programy mog± byæ czytane z pliku przy pomocy opcji \fB-f\fP.
53 dane wej¶ciowe odczytywane  s± z listy plików z wiersza poleceñ lub
54 ze standardowego wej¶cia, gdy lista ta jest pusta.
55 Wej¶cie rozbijane jest na rekordy okre¶lone wed³ug zmiennej opisuj±cej
56 separator rekordów, \fBRS\fP (record separator). Pocz±tkowo
57 \fBRS\fP="\en"
58 a rekordy s± to¿same z wierszami. Ka¿dy z rekordów porównywany jest z ka¿dym
59 ze
60 .IR wzorców ,
61 a je¶li pasuje, wykonywany jest tekst programu dla
62 .IR "{akcji}" .
63 .SH OPCJE
64 .TP \w'\-\fBW'u+\w'\fRsprintf=\fInum\fR'u+2n
65 \fB\-F \fIwarto¶æ
66 ustawia separator pól, \fBFS\fP, na
67 .IR warto¶æ .
68 .TP
69 \fB\-f \fIplik
70 Tekst programu jest czytany z \fIpliku\fP zamiast z wiersza poleceñ.
71 Dopuszcza siê wielokrotne u¿ycie opcji
72 .BR \-f .
73 .TP
74 \fB\-v \fIzmn\fB=\fPwarto¶æ
75 przypisuje
76 .I warto¶æ
77 zmiennej programu
78 .IR zmn .
79 .TP
80 .B \-\|\-
81 wskazuje jednoznaczny koniec opcji.
82 .PP
83 Powy¿sze opcje bêd± dostêpne w ka¿dej zgodnej z Posix implementacji AWK.
84 Opcje specyficzne dla danej implementacji poprzedzane s± przez
85 .BR \-W .
86 .B mawk
87 udostêpnia sze¶æ takich rozszerzeñ:
88 .TP \w'\-\fBW'u+\w'\fRsprintf=\fInum\fR'u+2n
89 .B \-W version
90 .B mawk
91 wypisuje sw± wersjê i prawa autorskie na stdout (standardowym wyj¶ciu), za¶
92 wkompilowane ograniczenia na stderr (standardowym wyj¶ciu b³êdów).
93 Koñczy pracê z kodem 0.
94 .TP
95 .B \-W dump
96 wypisuje na stdout asembleropodobny listing wewnêtrznej
97 reprezentacji programu i koñczy pracê z kodem 0 (przy pomy¶lnej kompilacji).
98 .TP
99 .B \-W interactive
100 ustawia niebuforowane zapisy na stdout i buforowane wierszami odczyty
101 z stdin (standardowego wej¶cia). Rekordy z stdin s± wierszami niezale¿nie
102 od warto¶ci
103 .BR RS .
104 .TP
105 .B \-W exec \fIplik
106 Tekst programu czytany jest z
107 .I pliku
108 i jest to ostatnia opcja. Przydatne na systemach obs³uguj±cych konwencjê
109 "liczb magicznych"
110 .B #!
111 dla skryptów wykonywalnych.
112 .TP
113 .B \-W sprintf=\fInum
114 ustawia rozmiar bufora wewnêtrznego sprintf
115 na
116 .I num
117 bajtów. Czêstsze ni¿ sporadyczne stosowanie tej opcji wskazuje, ¿e
118 .B mawk
119 powinien zostaæ zrekompilowany.
120 .TP
121 .B \-W posix_space
122 wymusza na
123 .BR mawk ,
124 by nie uwa¿a³ '\en' za odstêp.
125 .PP
126 Rozpoznawane s± krótkie postacie
127 .BR \-W [ vdiesp ],
128 za¶ w niektórych systemach \fB\-We\fP jest obowi±zkowe dla unikniêcia
129 ograniczeñ d³ugo¶ci wiersza poleceñ.
130 .SH "JÊZYK AWK"
131 .SS "1. Struktura programu"
132 Program w jêzyku AWK jest sk³ada siê z sekwencji par
133 .I "wzorzec {akcja}"
134 i definicji funkcji u¿ytkownika.
135 .PP
136 Wzorcem mo¿e byæ:
137 .nf
138 .RS
139 .B BEGIN
140 .B END
141 .I wyra¿enie
142 .IB wyra¿enie ", " wyra¿enie
143 .sp
144 .RE
145 .fi
146 Mo¿na pomin±c jeden z elementów z pary \fIwzorzec {akcja}\fP, ale nie oba.
147 Je¿eli pominiêto
148 .IR {akcjê} ,
149 to jest ni± domniemane \fB{ print }\fP.
150 Je¿eli pominiêto
151 .IR wzorzec ,
152 to jest on niejawnie dopasowany.
153 Wzorce
154 .B BEGIN
155 i
156 .B END
157 wymagaj± akcji.
158 .PP
159 Instrukcje zakoñczone s± znakami nowej linii, ¶rednikami
160 lub oboma tymi znakami.
161 Grupy instrukcji, jak akcje czy cia³a pêtli, ³±czone s± w bloki
162 za po¶rednictwem \fB{ ... }\fP, jak w C.
163 Ostatnia instrukcja w bloku nie wymaga znaku koñcz±cego.
164 Puste wiersza nie maj± znaczenia; pusta instrukcja zakoñczona jest
165 ¶rednikiem. D³ugie instrukcje mo¿na kontynuowaæ przy pomocy odwrotnego
166 uko¶nika \fB\e\fP.
167 Instrukcjê mo¿na podzieliæ miêdzy wiersze bez u¿ycia odwrotnego uko¶nika
168 po przecinku, nawiasie otwieraj±cym, &&, ||,
169 .BR do ,
170 .BR else  ,
171 nawiasie zamykaj±cym instrukcji
172 .BR if ,
173 .B while
174 lub
175 .B for
176 oraz nawiasie zamykaj±cym definicji funkcji.
177 Komentarze zaczynaj± siê od \fB#\fP i rozci±gaj± siê do a¿ koñca wiersza,
178 choæ go nie obejmuj±.
179 .PP
180 Poni¿sze instrukcje steruj± przep³ywem programu wewn±trz bloków.
181 .RS
182 .PP
183 .B if
184 ( \*(ex )
185 .I instrukcja
186 .PP
187 .B if
188 ( \*(ex )
189 .I instrukcja
190 .B else
191 .I instrukcja
192 .PP
193 .B while
194 ( \*(ex )
195 .I instrukcja
196 .PP
197 .B do
198 .I instrukcja
199 .B while
200 ( \*(ex )
201 .PP
202 .B for
203 (
204 \fIwyr_opc\fR ;
205 \fIwyr_opc\fR ;
206 \fIwyr_opc\fR
207 )
208 .I instrukcja
209 .PP
210 .B for
211 ( \fIzmn \fBin \fItablica\fR )
212 .I instrukcja
213 .PP
214 .B continue
215 .PP
216 .B break
217 .RE
218 .\"
219 .SS "2. Typy danych, konwersja i porównywanie"
220 Istniej± dwa podstawowe typy danych, numeryczny i ³añcuch znakowy.
221 Sta³e liczbowe mog± byæ ca³kowite, jak \-2, dziesiêtne jak 1.08,
222 lub podane w notacji naukowej jak \-1.1e4 czy .28E\-3. Wszystkie liczby
223 s± reprezentowane wewnêtrznie w arytmetyce zmiennoprzecinkowej. Wszystkie
224 obliczenia równie¿ s± zmiennoprzecinkowe.
225 Tak wiêc, na przyk³ad, wyra¿enie
226 0.2e2 == 20
227 jest prawd±. Prawda reprezentowana jest jako 1.0.
228 .PP
229 Sta³e ³añcuchowe ujête s± w cudzys³owy.
230 .sp
231 .ce
232 "To jest ³añcuch ze znakiem nowej linii na koñcu.\en"
233 .sp
234 £añcuchy znakowe mog± byæ kontynuowane w kolejnych wierszach dziêki
235 poprzedzeniu znaku nowej linii odwrotnym uko¶nikiem (\e).
236 Rozpoznawane s± nastêpuj±ce sekwencje specjalne:
237 .nf
238 .sp
239     \e\e        \e
240     \e"        "
241     \ea        dzwonek, ascii 7
242     \eb        backspace, ascii 8
243     \et        tabulacja, ascii 9
244     \en        znak nowej linii, newline , ascii 10
245     \ev        tabulacja pionowa, ascii 11
246     \ef        wysuw strony, formfeed, ascii 12
247     \er        powrót karetki, carriage return, ascii 13
248     \eddd      1, 2 lub 3 cyfry ósemkowe dla ascii ddd
249     \exhh      1 lub 2 cyfry szesnastkowe dla ascii hh
250 .sp
251 .fi
252 Je¿eli odwrotnym uko¶nikiem zostanie poprzedzony inny znak, np. \ec, wynikiem
253 bêdzie sekwencja ¼ród³owa: \ec, tzn.
254 .B mawk
255 zignoruje specjalne w³a¶ciwo¶ci odwrotnego uko¶nika.
256 .PP
257 Naprawdê istniej± trzy podstawowe typy danych; trzecim jest
258 .IR "liczba i ³añcuch" ,
259 posiadaj±cy równocze¶nie warto¶æ liczbow± i warto¶æ ³añcuchow±.
260 Zmienne definiowane przez u¿ytkownika pojawiaj± siê przy pierwszym
261 ich u¿yciu i s± inicjowane na
262 .IR null ,
263 typu "liczba i ³añcuch",
264 maj±ce warto¶æ numeryczn± 0 a ³añcuchow± "".
265 Nietrywialne dane typu liczbowo-³añcuchowego pochodz± z wej¶cia
266 i zwykle przechowywane s± w polach (zobacz sekcja 4).
267 .PP
268 Typ wyra¿enia okre¶lany jest przez jego kontekst. W razie potrzeby wykonywana
269 jest automatyczna konwersja typów. Na przyk³ad, wyznaczenie warto¶ci
270 instrukcji
271 .nf
272 .sp
273         y = x + 2  ;  z = x  "hello"
274 .sp
275 .fi
276 Warto¶æ przechowywana w zmiennej y otrzyma typ numeryczny.
277 Je¿eli x nie jest numeryczne, to warto¶æ odczytana z x zostanie
278 skonwertowana na liczbê przed dodaniem do 2 i zachowaniem w y.
279 Warto¶æ przechowywana w zmiennej z bêdzie typu ³añcuchowego: warto¶æ x
280 zostanie przekszta³cona na ³añcuch, je¶li bêdzie to niezbêdne, i z³±czona
281 z "hello". Oczywi¶cie, warto¶æ i typ przechowywane w x nie zmieniaj± siê
282 w ¿adnej z tych konwersji.
283 Wyra¿enie ³añcuchowe przekszta³cane jest na numeryczne przy zastosowaniu
284 najd³u¿szego swego przedrostka numerycznego jak w
285 .IR atof (3).
286 Wyra¿enie numeryczne konwertowane jest na ³añcuch poprzez zast±pienie
287 .I wyra¿
288 przez
289 .BR sprintf(CONVFMT ,
290 .IR wyra¿ ),
291 chyba ¿e
292 .I wyra¿
293 mo¿e byæ reprezentowane w danym komputerze jako dok³adna liczba ca³kowita,
294 wówczas przekszta³cane jest na \fBsprintf\fR("%d", \*(ex).
295 .B Sprintf()
296 jest funkcj± wbudowan± AWK, dubluj±c± dzia³anie
297 .IR sprintf (3),
298 za¶
299 .B CONVFMT
300 jest wbudowan± zmienn± u¿ywan± do wewnêtrznej konwersji z liczby na ³añcuch
301 i inicjowan± na "%.6g".
302 Mo¿na wymusiæ jawn± konwersjê typów:
303 \*(ex ""
304 jest ³añcuchowe, a
305 \*(ex+0
306 jest numeryczne.
307 .PP
308 Przy wyliczaniu,
309 \fIwyra¿1\fP \fBop-rel\fP \fIwyra¿2\fP,
310 je¿eli oba operandy s± numeryczne lub numeryczno-³añcuchowe, to
311 porównywanie jest numeryczne; je¿eli oba operandy s± ³añcuchami to
312 porównywanie jest ³añcuchowe; je¶li jeden z operandów jest ³añcuchem, to
313 operand nie-³añcuchowy jest przekszta³cany i porównywanie jest ³añcuchowe.
314 Wynik jest numeryczny, 1 lub 0.
315 .PP
316 W kontekstach logicznych, jak
317 \fBif\fP ( \*(ex ) \fIinstrukcja\fP,
318 warto¶ci± wyra¿enia ³añcuchowego jest prawda wtedy i tylko wtedy, gdy
319 nie jest ono ³añcuchem pustym ""; wyra¿eñ liczbowych wtedy i tylko wtedy
320 gdy nie s± numerycznie zerem.
321 .\"
322 .SS "3. Wyra¿enia regularne"
323 W jêzyku AWK rekordy, pola i ³añcuchy s± czêsto sprawdzane na dopasowanie
324 do
325 .IR "wyra¿enia regularnego" .
326 Wyra¿enia regularne umieszczone s± miêdzy uko¶nikami, a
327 .nf
328 .sp
329         \*(ex ~ /\fIr\fR/
330 .sp
331 .fi
332 jest wyra¿eniem AWK o warto¶ci 1 je¶li \*(ex "pasuje do"
333 .IR r ,
334 co oznacza, ¿e pewien pod³añcuch \*(ex jest w zestawie ³añcuchów
335 zdefiniowanych przez
336 .IR r .
337 Je¶li nie wystêpuje dopasowanie, to wyra¿enie otrzymuje warto¶æ 0;
338 zast±pienie \fB~\fP operatorem "nie pasuje", \fB!~\fP, odwraca znaczenia.
339 Pary wzorzec-akcja
340 .nf
341 .sp
342         /\fIr\fR/ { \fIakcja\fR }   i\
343    \fB$0\fR ~ /\fIr\fR/ { \fIakcja\fR }
344 .sp
345 .fi
346 s± takie same,
347 za¶ dla ka¿dego rekordu wej¶ciowego pasuj±cego do
348 .IR r
349 wykonywana jest
350 .IR akcja .
351 Faktycznie, /\fIr\fR/ jest wyra¿eniem AWK równowa¿nym (\fB$0\fR ~ /\fIr\fR/)
352 wszêdzie z wyj±tkiem wyst±pienia po prawej stronie operatora dopasowania
353 lub przekazywania do funkcji wbudowanej oczekuj±cej jako argumentu wyra¿enia
354 regularnego.
355 .PP
356 AWK stosuje rozszerzone wyra¿enia regularne jak
357 .BR egrep (1).
358 Metaznakami wyra¿eñ regularnych, tj. znakami o specjalnym znaczeniu
359 w wyra¿eniach regularnych s±
360 .nf
361 .sp
362         \ ^ $ . [ ] | ( ) * + ?
363 .sp
364 .fi
365 Wyra¿enia regularne konstruowane s± ze znaków jak ni¿ej:
366 .RS
367 .TP \w'[^c\d1\uc\d2\uc\d3\u...]'u+1n
368 \fIc\fR
369 dopasowuje dowolny znak nie bêd±cy metaznakiem
370 .IR c .
371 .TP
372 \fB\e\fIc
373 dopasowuje znak zdefiniowany przez tê sam± sekwencjê specjaln± u¿ywan±
374 w sta³ych ³añcuchowych lub dos³owny znak
375 .I c
376 je¶li
377 \e\fIc
378 nie jest sekwencj± specjaln±.
379 .TP
380 \fB\&\.
381 dopasowuje dowolny znak (³±cznie ze znakiem nowej linii).
382 .TP
383 \fB^
384 dopasowuje pocz±tek ³añcucha.
385 .TP
386 \fB$
387 dopasowuje koniec ³añcucha.
388 .TP
389 \fB[\fIc\d1\uc\d2\uc\d3\u\fR...\fB]
390 dopasowuje dowolny znak z klasy \fIc\d1\uc\d2\uc\d3\u\fP... .
391 Zakres znaków oznaczany jest przez \fIc\d1\u\fP\fB\-\fP\fIc\d2\u\fP
392 wewn±trz klasy [...].
393 .TP
394 \fB[^\fIc\d1\uc\d2\uc\d3\u\fR...\fB]
395 dopasowuje dowolny znak nie nale¿±cy do klasy \fIc\d1\uc\d2\uc\d3\u\fP...
396 .RE
397 .sp
398 Wyra¿enia regularne konstruowane s± z innych wyra¿eñ regularnych
399 w nastêpuj±cy sposób:
400 .RS
401 .TP \w'[^c\d1\uc\d2\uc\d3\u...]'u+1n
402 \fIr\d1\u\fIr\d2\u
403 dopasowuje \fIr\d1\u\fP, bezpo¶rednio po którym nastêpuje \fIr\d2\u\fP
404 (konkatenacja).
405 .TP
406 \fIr\d1\u \fB| \fIr\d2\u
407 dopasowuje \fIr\d1\u\fP lub \fIr\d2\u\fP (alternatywa).
408 .TP
409 \fIr\fB*
410 dopasowuje zero lub wiêcej wyst±pieñ \fIr\fP .
411 .TP
412 \fIr\fB+
413 dopasowuje jedno lub wiêcej \fIr\fP.
414 .TP
415 \fIr\fB?
416 dopasowuje zero lub jedno \fIr\fP.
417 .TP
418 \fB(\fIr\fB)
419 dopasowuje \fIr\fP, umo¿liwiaj±c grupowanie.
420 .RE
421 .sp
422 Operatory wed³ug rosn±cego priorytetu: alternatywa, konkatenacja
423 (z³±czenie) i operatory jednoargumentowe (*, + lub ?).
424 .PP
425 Na przyk³ad,
426 .nf
427 .sp
428     /^[_a\-zA-Z][_a\-zA\-Z0\-9]*$/  i
429     /^[\-+]?([0\-9]+\e\|.?|\e\|.[0\-9])[0\-9]*([eE][\-+]?[0\-9]+)?$/
430 .sp
431 .fi
432 dopasowuj± odpowiednio identyfikatory AWK i sta³e liczbowe AWK.
433 Zauwa¿, ¿e kropka \fB.\fP musi byæ chroniona odwrotnym uko¶nikiem, by zosta³a
434 rozpoznana jako kropka dziesiêtna, a nie dopasowanie dowolnego znaku,
435 a metaznaki wewn±trz klas znaków trac± swe specjalne znaczenie.
436 .PP
437 Po prawej stronie operatorów ~ lub !~ mo¿e zostaæ u¿yte dowolne wyra¿enie.
438 Podobnie, dowolne wyra¿enie mo¿na przekazaæ do funkcji wbudowanej oczekuj±cej
439 wyra¿enia regularnego.
440 W razie potrzeby zostanie ono przekszta³cone na ³añcuch, a nastêpnie
441 zinterpretowane jako wyra¿enie regularne. Na przyk³ad,
442 .nf
443 .sp
444         BEGIN { identifier = "[_a\-zA\-Z][_a\-zA\-Z0\-9]*" }
445
446         $0 ~ "^" identifier
447 .sp
448 .fi
449 wypisuje wszystkie wiersze zaczynaj±ce siê od jakiego¶ identyfikatora AWK.
450 .PP
451 .B mawk
452 rozpoznaje puste wyra¿enie regularne, //\|, dopasowuj±ce ³añcuch pusty.
453 Zatem pasuje do niego dowolny ³añcuch na pocz±tku, koñcu i pomiêdzy dowolnym
454 znakiem. Na przyk³ad,
455 .nf
456 .sp
457         echo  abc | mawk '{ gsub(//, "X") ; print }'
458         XaXbXcX
459 .sp
460 .fi
461 .\"
462 .SS "4. Rekordy i pola"
463 Rekordy czytane s± po jednym na raz, i przechowywane w zmiennej
464 .BR $0 .
465 Rekord rozbijany jest na
466 .IR pola ,
467 przechowywane w
468 .BR $1 ,
469 .BR $2 ", ...,"
470 .BR $NF .
471 Wbudowana zmienna
472 .B NF
473 ustawiana jest na liczbê pól, a
474 .B NR
475 i
476 .B FNR
477 s± zwiêkszane o 1.
478 Pola powy¿ej
479 .B $NF
480 ustawiane s± na "".
481 .PP
482 Przypisanie do
483 .B $0
484 powoduje, ¿e pola i
485 .B NF
486 s± obliczane ponownie.
487 Przypisanie do
488 .B NF
489 lub do pola
490 powoduje, ¿e
491 .B $0
492 jest ponownie tworzone przez z³±czenie kolejnych pól separowanych przez
493 .BR OFS .
494 Przypisanie do pola o indeksie wiêkszym od
495 .BR NF ,
496 powiêksza
497 .B NF
498 i powoduje ponowne utworzenie
499 .BR $0 .
500 .PP
501 Dane wej¶ciowe przechowywane w polach s± ³añcuchami, chyba ¿e ca³e pole
502 ma postaæ numeryczn± a wówczas typ jest liczbowo-³añcuchowy.
503 Na przyk³ad,
504 .sp
505 .nf
506         echo 24 24E |
507         mawk '{ print($1>100, $1>"100", $2>100, $2>"100") }'
508         0 1 1 1
509 .fi
510 .sp
511 .B $0
512 i
513 .B $2
514 s± ³añcuchami a
515 .B $1
516 jest liczbowo-³añcuchowe. Pierwsze porównanie jest numeryczne, drugie
517 ³añcuchowe, trzecie ³añcuchowe (100 jest konwertowane na "100"),
518 i ostatnie ³añcuchowe.
519 .\"
520 .SS "5. Wyra¿enia i operatory"
521 .PP
522 Sk³adnia wyra¿eñ jest podobna jak w C. Wyra¿eniami pierwotnymi s± sta³e
523 liczbowe, sta³e ³añcuchowe, zmienne, pola, tablice i wywo³ania funkcji.
524 Identyfikator zmiennej, tablicy b±d¼ funkcji mo¿e byæ ci±giem liter, cyfr
525 i znaków podkre¶lenia, nie rozpoczynaj±cym siê od cyfry.
526 Zmienne nie s± deklarowane; zaistniej± przy pierwszym do nich odwo³aniu,
527 a inicjowane s± na
528 .IR null .
529 .PP
530 Nowe wyra¿enia tworzone s± z u¿yciem poni¿szych, podanych w kolejno¶ci
531 rosn±cego priorytetu, operatorów:
532 .PP
533 .RS
534 .nf
535 .vs +2p  \"  open up a little
536 \fIprzypisanie\fR                =  +=  \-=  *=  /=  %=  ^=
537 \fIwarunkowe\fR                 ?  :
538 \fIlogiczne or\fR               ||
539 \fIlogiczne and\fR              &&
540 \fIprzynale¿no¶æ do tablicy\fR  \fBin
541 \fIdopasowanie\fR               ~   !~
542 \fIrelacyjne\fR                 <  >   <=  >=  ==  !=
543 \fIkonkatenacja\fR              (bez specjalnego operatora)
544 \fIdodawanie/odejmowanie\fR     +  \-
545 \fImno¿enie/dzielenie\fR        *  /  %
546 \fIjednoargumentowe\fR          +  \-
547 \fIlogiczne not\fR              !
548 \fIpotêgowanie\fR               ^
549 \fIinkrementacja/dekr.\fR       ++ \-\|\- (zarówno post jak i pre)
550 \fIpole\fR                      $
551 .vs
552 .RE
553 .PP
554 .fi
555 Przypisanie, operatory warunkowe i potêgowanie wi±¿± od prawej do lewej;
556 pozosta³e  od lewej do prawej. Ka¿de wyra¿enie mo¿e byæ umieszczone
557 w nawiasach.
558 .\"
559 .SS "6. Tablice"
560 .ds ae \fItablica\fR[\fIwyra¿\fR]
561 Awk obs³uguje tablice jednowymiarowe. Elementy tablic wskazuje siê jako \*(ae.
562 .I Wyra¿
563 jest przekszta³cane wewnêtrznie na typ ³añcuchowy, wiêc, na przyk³ad,
564 A[1] i A["1"] s± tym samym elementem, a faktycznym indeksem jest "1".
565 Tablice indeksowane ³añcuchami zwane s± tablicami asocjacyjnymi (tablicami
566 przyporz±dkowuj±cymi).
567 Pierwotnie tablica jest pusta; elementy zaistniej± przy pierwszym do nich
568 odwo³aniu.
569 Wyra¿enie
570 \fIwyra¿\fB in\fI tablica\fR
571 daje w wyniku 1 je¿eli istnieje \*(ae, w przeciwnym razie 0.
572 .PP
573 Istnieje postaæ instrukcji
574 .B for
575 wykonuj±ca pêtlê po wszystkich indeksach tablicy.
576 .nf
577 .sp
578         \fBfor\fR ( \fIzmn\fB in \fItablica \fR) \fIinstrukcja\fR
579 .sp
580 .fi
581 ustawia
582 .I zmn
583 na ka¿dy z indeksów
584 .I tablicy
585 i wykonuje
586 .IR instrukcjê .
587 Kolejno¶æ, w jakiej
588 .I zmn
589 przechodzi przez indeksy
590 .I tablicy
591 nie jest zdefiniowana.
592 .PP
593 Instrukcja
594 .B delete
595 \*(ae,
596 powoduje usuniêcie
597 \*(ae.
598 .B mawk
599 obs³uguje rozszerzenie,
600 .B delete
601 .IR tablica ,
602 które usuwa wszystkie elementy
603 .IR tablicy .
604 .PP
605 Tablice wielowymiarowe tworzone s± sztucznie przez konkatenacjê
606 z zastosowaniem wbudowanej zmiennej
607 .BR SUBSEP .
608 \fItablica\fB[\fIwyra¿\d1\u\fB,\fIwyra¿\d2\u\fB]\fR
609 jest równowa¿nikiem
610 \fItablica\fB[\fIwyra¿\d1\u \fBSUBSEP \fIwyra¿\d2\u\fB]\fR.
611 Sprawdzanie elementu tablicy wielowymiarowej u¿ywa indeksu w nawiasach,
612 jak w
613 .sp
614 .nf
615         if ( (i, j) in A )  print A[i, j]
616 .fi
617 .sp
618 .\"
619 .SS "7. Zmienne wbudowane"
620 .PP
621 Poni¿sze zmienne s± zmiennymi wbudowanymi. S± one inicjowane przed wykonaniem
622 programu.
623 .RS
624 .TP \w'FILENAME'u+2n
625 .B ARGC
626 liczba argumentów wiersza poleceñ.
627 .TP
628 .B ARGV
629 tablica argumentów wiersza poleceñ, 0..ARGC-1.
630 .TP
631 .B CONVFMT
632 format do wewnêtrznej konwersji liczb na ³añcuchy, pocz±tkowo = "%.6g".
633 .TP
634 .B ENVIRON
635 tablica zaindeksowana zmiennymi ¶rodowiska. £añcuch ¶rodowiska,
636 \fIzmn=warto¶æ\fR przechowywany jest jako
637 .BI ENVIRON[ zmn "] ="
638 .IR warto¶æ .
639 .TP
640 .B FILENAME
641 nazwa bie¿±cego pliku wej¶ciowego.
642 .TP
643 .B FNR
644 numer bie¿±cego rekordu w
645 .BR FILENAME .
646 .TP
647 .B FS
648 dzieli rekordy na pola jako wyra¿enie regularne.
649 .TP
650 .B NF
651 liczba pól bie¿±cego rekordu.
652 .TP
653 .B NR
654 numer bie¿±cego rekordu w ca³kowitym strumieniu wej¶ciowym.
655 .TP
656 .B OFMT
657 format do wydruku liczb; pocz±tkowo = "%.6g".
658 .TP
659 .B OFS
660 wstawiane pomiêdzy polami w wyj¶ciu, pocz±tkowo = " ".
661 .TP
662 .B ORS
663 koñczy ka¿dy z rekordów wyj¶ciowych, pocz±tkowo = "\en".
664 .TP
665 .B RLENGTH
666 d³ugo¶æ ustawiona przez ostatnie wywo³anie wbudowanej funkcji
667 .BR match() .
668 .TP
669 .B RS
670 separator rekordów wej¶ciowych, pocz±tkowo = "\en".
671 .TP
672 .B  RSTART
673 indeks ustawiony przez ostatnie wywo³anie
674 .BR match() .
675 .TP
676 .B SUBSEP
677 u¿ywany do budowy indeksów tablic wielowymiarowych, pocz±tkowo = "\e034".
678 .RE
679 .\"
680 .SS "8. Funkcje wbudowane"
681 Funkcje ³añcuchowe
682 .RS
683 .TP
684 .RI \fBgsub\fP( r , s , t ")  \fBgsub\fP(" r , s )
685 Zastêpowanie globalne (global substitution), ka¿de dopasowanie wyra¿enia
686 regularnego
687 .I r
688 w zmiennej
689 .I t
690 zastêpowane jest ³añcuchem
691 .IR s .
692 Zwracana jest liczba wykonanych zast±pieñ.
693 Je¿eli pominiêto
694 .IR t ,
695 to u¿ywane jest
696 .BR $0 .
697 Znak \fB&\fP w ³añcuchu zastêpuj±cym
698 .I s
699 zastêpowany jest dopasowanym pod³añcuchem ³añcucha
700 .IR t .
701 \fB\e&\fP oraz \fB\e\e\fP daj±, odpowiednio, dos³owne \fB&\fP i \fB\e\fP
702 w ³añcuchu zastêpuj±cym.
703 .TP
704 .RI \fBindex\fP( s , t )
705 Je¿eli
706 .I t
707 jest pod³añcuchem
708 .IR s ,
709 to zwracana jest pozycja, na której rozpoczyna siê
710 .IR t ,
711 w przeciwnym razie zwracane jest 0.
712 Pierwszy znak
713 .I s
714 jest na pozycji 1.
715 .TP
716 .RI \fBlength\fP( s )
717 Zwraca d³ugo¶æ ³añcucha
718 .IR s .
719 .TP
720 .RI \fBmatch\fP( s , r )
721 Zwraca indeks pierwszego najd³u¿szego dopasowania wyra¿enia regularnego
722 .I r
723 w ³añcuchu
724 .IR s .
725 Zwraca 0 je¶li nie wystêpuje dopasowanie.
726 Jako skutek uboczny, nastêpuje ustawienie
727 .B RSTART
728 na zwracan± warto¶æ.
729 .B RLENGTH
730 ustawiane jest na d³ugo¶æ dopasowania lub \-1 je¶li brak dopasowania.
731 Je¿eli dopasowano ³añcuch pusty, to
732 .B RLENGTH
733 ustawiane jest na 0, a zwracane jest 1 je¶li dopasowanie by³o na pocz±tku,
734 za¶ length(\fIs\fR)+1, gdy na koñcu ³añcucha.
735 .TP
736 .RI \fBsplit\fP( s , A , r ")  \fBsplit\fP(" s , A )
737 £añcuch
738 .I s
739 rozbijany jest na pola przez wyra¿enie regularne
740 .I  r
741 a pola wpisywane s± do tablicy
742 .IR A .
743 Zwracana jest liczba pól. Szczegó³y w sekcji 11 poni¿ej.
744 Je¿eli pominiêto
745 .IR r ,
746 u¿ywane jest
747 .BR FS .
748 .TP
749 .RI \fBsprintf\fP( format , lista-wyra¿ )
750 Zwraca ³añcuch utworzony z
751 .I listy-wyra¿eñ
752 zgodnie z
753 .IR formatem .
754 Zobacz opis printf() poni¿ej.
755 .TP
756 .RI \fBsub\fP( r , s , t ")  \fBsub\fP(" r , s )
757 Pojedyncze zast±pienie. Takie samo, jak gsub(), z wyj±tkiem tego, ¿e
758 wykonywane jest co najwy¿ej jedno zast±pienie.
759 .TP
760 .RI \fBsubstr\fP( s , i , n ")  \fBsubstr\fP(" s , i )
761 Zwraca pod³añcuch ³añcucha
762 .IR s ,
763 poczynaj±c od indeksu
764 .IR i ,
765 o d³ugo¶ci
766 .IR n .
767 Je¶li pominiêto
768 .IR n ,
769 zwracana jest koñcówka
770 .IR s ,
771 poczynaj±c od pozycji
772 .IR i .
773 .TP
774 .RI \fBtolower\fP( s )
775 Zwraca kopiê
776 .I s
777 ze wszystkimi du¿ymi literami przekszta³conymi na ma³e.
778 .TP
779 .RI \fBtoupper\fP( s )
780 Zwraca kopiê
781 .I s
782 ze wszystkimi ma³ymi literami przekszta³conymi na du¿e.
783 .RE
784 .PP
785 Funkcje arytmetyczne
786 .RS
787 .PP
788 .nf
789 \fBatan2\fR(\fIy\fR,\fIx\fR)     arcus tangens z \fIy\fR/\fIx\fR pomiêdzy -PI i PI.
790 .PP
791 \fBcos\fR(\fIx\fR)         funkcja cosinus, \fIx\fR w radianach.
792 .PP
793 \fBexp\fR(\fIx\fR)         funkcja wyk³adnicza.
794 .PP
795 \fBint\fR(\fIx\fR)         zwraca \fIx\fR obciête w stronê zera.
796 .PP
797 \fBlog\fR(\fIx\fR)         logarytm naturalny.
798 .PP
799 \fBrand\fR()         zwraca liczbê losow± miêdzy zero a jeden.
800 .PP
801 \fBsin\fR(\fIx\fR)         funkcja sinus, \fIx\fR w radianach.
802 .TP
803 \fBsqrt\fR(\fIx\fR)        zwraca pierwiastek kwadratowy z \fIx\fR.
804 .fi
805 .TP
806 .RI \fBsrand\fP( wyra¿ ")  \fBsrand\fP()"
807 Inicjuje ziarenko generatora liczb losowych, u¿ywaj±c zegara je¶li pominiêto
808 .IR wyra¿ ,
809 i zwraca warto¶æ poprzedniego ziarenka losowego.
810 .B mawk
811 inicjuje generator liczb losowych wed³ug zegara przy uruchomieniu,
812 wiêc nie ma faktycznej potrzeby wywo³ywania srand(). Srand(\fIwyra¿\fR)
813 przydaje siê do powtarzania ci±gów pseudolosowych.
814 .RE
815 .\"
816 .SS "9. Wej¶cie i wyj¶cie"
817 Istniej± dwie instrukcje wyj¶cia:
818 .B print
819 i
820 .BR printf .
821 .RS
822 .TP
823 .B print
824 zapisuje na standardowe wyj¶cie
825 .BR "$0  ORS" .
826 .TP
827 \fBprint\fP \fIwyra¿\d1\u\fR, \fIwyra¿\d2\u\fR, ..., \fIwyra¿\dn\u
828 zapisuje na standardowe wyj¶cie
829 \fIwyra¿\d1\u \fBOFS \fIwyra¿\d2\u \fBOFS\fR ... \fIwyra¿\dn\u
830 .BR ORS .
831 Wyra¿enia numeryczne s± konwertowane na ³añcuchy zgodnie z
832 .BR OFMT .
833 .TP
834 \fBprintf \fIformat\fR, \fIlista-wyra¿
835 powiela funkcjê biblioteczn± printf z C, pisz±c na standardowe wyj¶cie.
836 Rozpoznawany jest komplet specyfikacji formatów z ANSI C z konwersjami
837 %c, %d, %e, %E, %f, %g, %G, %i, %o, %s, %u, %x, %X i %%,
838 oraz kwalifikatorami konwersji h i l.
839 .RE
840 .PP
841 Lista argumentów print lub printf mo¿e byæ opcjonalnie ujêta w nawiasy.
842 Print formatuje liczby przy pomocy
843 .B OFMT
844 lub "%d" dla dok³adnie ca³kowitych.
845 "%c" z argumentem numerycznym wypisuje odpowiedni znak 8-bitowy, z argumentem
846 ³añcuchowym wypisuje pierwszy znak ³añcucha.
847 Wyj¶cie print i printf mo¿na przekierowaæ do pliku lub polecenia do³±czaj±c
848 .B >
849 .IR plik ,
850 .B >>
851 .I plik
852 lub
853 .B |
854 .I polecenie
855 na koñcu instrukcji drukowania.
856 Przekierowanie otwiera
857 .I plik
858 lub
859 .I polecenie
860 tylko raz, kolejne przekierowania do³±czane s± do ju¿ otwartego strumienia.
861 Zgodnie z konwencj±,
862 .B mawk
863 ³±czy nazwê pliku "/dev/stderr" z stderr, co pozwala na przekierowanie
864 wyników print i printf na standardowe wyj¶cie diagnostyczne.
865 .B mawk
866 wi±¿e równie¿, odpowiednio, "\-" i "/dev/stdout" z stdin i stdout, co
867 umo¿liwia przysy³anie tych strumieni do funkcji.
868 .PP
869 Funkcja wej¶cia
870 .B getline
871 ma nastêpuj±ce warianty:
872 .RS
873 .TP
874 .B getline
875 czyta do
876 .BR $0 ,
877 aktualizuje pola,
878 .BR NF ,
879 .B  NR
880 i
881 .BR FNR .
882 .TP
883 .B getline < \fIplik
884 czyta do
885 .B $0
886 z \fIpliku\fP, aktualizuje pola i
887 .BR NF .
888 .TP
889 .B getline \fIzmn
890 czyta nastêpny rekord do zmiennej
891 .IR zmn ,
892 aktualizuje
893 .B NR
894 i
895 .BR FNR .
896 .TP
897 .B getline \fIzmn\fP < \fIplik
898 czyta nastêpny rekord
899 .I pliku
900 do zmiennej
901 .IR zmn .
902 .TP
903 \fIpolecenie\fB | getline
904 przesy³a potokiem rekord z
905 .I polecenia
906 do
907 .B $0
908 i aktualizuje pola i
909 .BR NF .
910 .TP
911 \fIpolecenie\fB | getline \fIzmn
912 przesy³a potokiem rekord z
913 .I polecenia
914 do zmiennej
915 .IR zmn .
916 .RE
917 .PP
918 Getline zwraca 0 na koñcu pliku, \-1 przy b³êdzie, w pozosta³ych
919 przypadkach 1.
920 .PP
921 Polecenia na koñcu potoków wykonywane s± przez /bin/sh.
922 .PP
923 Funkcja \fBclose\fR(\*(ex) zamyka plik lub potok skojarzony z
924 .IR wyra¿ .
925 Close zwraca 0 je¿eli
926 .I wyra¿
927 jest otwartym plikiem, kod zakoñczenia je¶li
928 .I wyra¿
929 jest poleceniem potoku, a \-1 w pozosta³ych przypadkach.
930 Close stosowane jest do ponownego odczytu pliku lub polecenia, upewnienia
931 siê, ¿e drugi koniec potoku wyj¶ciowego jest zakoñczony lub do zachowania
932 zasobów plikowych.
933 .\" conserve file resources.
934 .PP
935 Funkcja \fBfflush\fR(\*(ex) wymiata plik wyj¶ciowy lub potok skojarzony z
936 .IR wyra¿ .
937 Fflush zwraca 0 je¶li
938 .I wyra¿
939 jest otwartym strumieniem wyj¶ciowym, w przeciwnym razie \-1.
940 Fflush bez argumentu opró¿nia stdout.
941 Fflush z pustym argumentem ("") opró¿nia wszystkie otwarte wyj¶cia.
942 .PP
943 Funkcja
944 \fBsystem\fR(\fIwyra¿\fR)
945 wykorzystuje
946 /bin/sh
947 do wykonania
948 .I wyra¿
949 i zwraca kod zakoñczenia polecenia
950 .IR wyra¿ .
951 Zmiany tablicy
952 .B ENVIRON
953 nie s± przekazywane poleceniom wykonywanym przez
954 .B system
955 lub potoki.
956 .SS "10. Funkcje definiowane przez u¿ytkownika"
957 Funkcja definiowana przez u¿ytkownika ma nastêpuj±c± sk³adniê:
958 .nf
959 .sp
960     \fBfunction\fI nazwa\fR( \fIargumenty\fR ) { \fIinstrukcje\fR }
961 .sp
962 .fi
963 Cia³o funkcji mo¿e zawieraæ instrukcjê zwrócenia warto¶ci (return)
964 .nf
965 .sp
966      \fBreturn\fI opcjonalne-wyra¿\fR
967 .sp
968 .fi
969 Instrukcja return nie jest wymagana.
970 Wywo³ania funkcji mog± byæ zagnie¿d¿ane lub rekurencyjne.
971 Wyra¿enia przekazywane s± funkcjom przez warto¶æ a tablice przez wskazanie.
972 Dodatkowe argumenty s³u¿± jako zmienne lokalne i s± inicjowane na
973 .IR null .
974 Na przyk³ad,
975 .RI csplit( s , A )
976 wstawia ka¿dy znak
977 .I s
978 do tablicy
979 .I A
980 i zwraca d³ugo¶æ
981 .IR s .
982 .nf
983 .sp
984         function csplit(s, A,   n, i)
985         {
986           n = length(s)
987           for( i = 1 ; i <= n ; i++ ) A[i] = substr(s, i, 1)
988           return n
989         }
990 .sp
991 .fi
992 Wstawienie dodatkowych odstêpów pomiêdzy przekazywanymi parametrami
993 a zmiennymi lokalnymi wynika z konwencji.
994 Do funkcji mo¿na odwo³ywaæ siê przed ich zdefiniowaniem, ale nazwa funkcji
995 i nawias '(' rozpoczynaj±cy listê argumentów musz± siê stykaæ, by unikn±æ
996 pomy³ki z konkatenacj±.
997 .\"
998 .SS "11. Podzia³ ³añcuchów, rekordów i plików"
999 Programy awk u¿ywaj± tego samego algorytmu do rozbicia ³añcuchów na tablice
1000 przy pomocy split() i rekordów na pola wed³ug
1001 .BR FS .
1002 .B mawk
1003 stosuje zasadniczo ten sam algorytm przy podziale plików na rekordy
1004 wed³ug
1005 .BR RS .
1006 .PP
1007 .RI \fBSplit\fP( wyra¿ , A, sep )
1008 dzia³a nastêpuj±co:
1009 .RS
1010 .TP
1011 (1)
1012 Je¿eli pominiêto
1013 .IR sep ,
1014 to jest on zastêpowany przez
1015 .BR FS .
1016 .I Sep
1017 mo¿e byæ wyra¿eniem lub wyra¿eniem regularnym. Je¿eli jest wyra¿eniem typu
1018 nie-³añcuchowego, to jest przekszta³cane na ³añcuch.
1019 .TP
1020 (2)
1021 Je¶li
1022 .I sep
1023 = " " (pojedyncza spacja),
1024 to <ODSTÊP> jest obcinana z pocz±tku i koñca
1025 .IR wyra¿ ,
1026 a
1027 .I sep
1028 staje siê <ODSTÊPEM>.
1029 .B mawk
1030 definiuje <ODSTÊP> jako wyra¿enie regularne
1031 /[\ \et\en]+/.
1032 W przeciwnym wypadku
1033 .I sep
1034 traktowany jest jako wyra¿enie regularne, z wyj±tkiem tego, ¿e metaznaki
1035 dla ³añcucha o d³ugo¶ci 1 s± ignorowane, np.
1036 split(x, A, "*") i split(x, A, /\e*/) s± tym samym.
1037 .TP
1038 (3)
1039 Je¿eli \*(ex nie jest ³añcuchem, jest przekszta³cane na ³añcuch.
1040 Je¿eli \*(ex jest wówczas ³añcuchem pustym "", to split() zwraca 0
1041 a
1042 .I A
1043 jest ustawiane jako puste.
1044 W przeciwnym razie, wszystkie nienak³adaj±ce siê, niepuste i najd³u¿sze
1045 dopasowania
1046 .I sep
1047 w
1048 .IR wyra¿ ,
1049 dziel±
1050 .I wyra¿
1051 na pola, które wpisywane s± do
1052 .IR A .
1053 Pola s± umieszczane w
1054 A[1], A[2], ..., A[n] a split() zwraca n, liczbê pól, równ± liczbie dopasowañ
1055 plus jeden.
1056 Dane umieszczone w
1057 .I A
1058 wygl±daj±ce na numeryczne otrzymuj± typ liczbowo-³añcuchowy.
1059 .RE
1060 .PP
1061 Podzia³ rekordów na pola dzia³a tak samo, z wyj±tkiem tego, i¿ czê¶ci
1062 wpisywane s± do
1063 .BR $1 ,
1064 \fB$2\fR,...,
1065 .BR $NF .
1066 Je¿eli
1067 .B $0
1068 jest puste,
1069 .B NF
1070 jest ustawiane na 0 a wszystkie
1071 .B $i
1072 na "".
1073 .PP
1074 .B mawk
1075 dzieli pliki na rekordy przy pomocy tego samego algorytmu, ale z t± niewielk±
1076 ró¿nic±, i¿
1077 .B RS
1078 jest faktycznie ci±giem koñcz±cym a nie separatorem.
1079 (\fBORS\fR te¿ jest faktycznie ci±giem koñcz±cym).
1080 .RS
1081 .PP
1082 Np., je¿eli
1083 .B FS
1084 = ":+" a
1085 .B $0
1086 = "a::b:" , to
1087 .B NF
1088 = 3 a
1089 .B $1
1090 = "a",
1091 .B $2
1092 = "b" i
1093 .B $3
1094 = "", ale
1095 je¿eli zawarto¶ci± pliku wej¶ciowego jest "a::b:", za¶
1096 .B RS
1097 = ":+", to
1098 istniej± dwa rekordy "a" i "b".
1099 .RE
1100 .PP
1101 .B RS
1102 = " " nie ma specjalnego znaczenia.
1103 .PP
1104 Je¿eli
1105 .B FS
1106 = "", to
1107 .B mawk
1108 rozbija rekord na pojedyncze znaki, i, podobnie
1109 .RI split( s , A ,"")
1110 umieszcza poszczególne znaki
1111 .I s
1112 w
1113 .IR A .
1114 .\"
1115 .SS "12. Rekordy wielowierszowe"
1116 Poniewa¿
1117 .B mawk
1118 interpretuje
1119 .B RS
1120 jako wyra¿enie regularne, obs³uga rekordów wielowierszowych jest ³atwa.
1121 Ustawienie
1122 .B RS
1123 = "\en\en+", powoduje, ¿e rekordy rozdzielane s± co najmniej jednym pustym
1124 wierszem. Je¿eli
1125 .B FS
1126 = " " (domy¶lnie), to pojedyncze znaki nowej linii, wed³ug zasad <ODSTÊPU>
1127 powy¿ej, staj± siê odstêpami a pojedyncze znaki nowej linii s± separatorami
1128 pól.
1129 .RS
1130 .PP
1131 Na przyk³ad, je¶li w pliku jest "a\ b\enc\en\en",
1132 .B RS
1133 = "\en\en+" a
1134 .B FS
1135 = "\ ", to mamy jeden rekord "a\ b\enc" z trzema polami "a", "b" i "c".
1136 Zmiana
1137 .B FS
1138 = "\en", daje dwa pola "a b" i "c"; zmieniaj±c
1139 .B FS
1140 = "", otrzymujemy jedno pole identyczne jak rekord.
1141 .RE
1142 .PP
1143 Traktowanie wierszy ze spacjami lub tabulacjami jako pustych mo¿na uzyskaæ
1144 ustawiaj±c
1145 .B RS
1146 = "\en([\ \et]*\en)+".
1147 W celu utrzymania zgodno¶ci z innymi implementacjami awk, ustawienie
1148 .B RS
1149 = "" daje te same wyniki, co usuniêcie pustych wierszy z pocz±tku i koñca
1150 pliku i okre¶lanie rekordów tak, jakby
1151 .B RS
1152 = "\en\en+".
1153 Posix wymaga, by "\en" zawsze separowa³o rekordy gdy
1154 .B RS
1155 = "" niezale¿nie od warto¶ci
1156 .BR FS .
1157 .B mawk
1158 nie obs³uguje tej konwencji, gdy¿ zdefiniowanie "\en" jako <ODSTÊPU>
1159 czyni j± zbêdn±.
1160 .\"
1161 .PP
1162 W wiêkszo¶ci przypadków zmieniaj±c
1163 .B RS
1164 w celu obs³ugi rekordów wielowierszowych, stosuje siê te¿ zmienione
1165 na "\en\en"
1166 .BR ORS ,
1167 aby na wyj¶ciu zachowaæ odstêpy miêdzy rekordami.
1168 .\"
1169 .SS "13. Wykonywanie programu"
1170 Ta sekcja opisuje kolejno¶æ wykonywania programu.
1171 Po pierwsze,
1172 .B ARGC
1173 ustawiane jest na ca³kowit± liczbê argumentów wiersza poleceñ przekazanych
1174 do fazy wykonania programu.
1175 .B ARGV[0]
1176 ustawiane jest na nazwê interpretera AWK a
1177 \fBARGV[1]\fR ...
1178 .B ARGV[ARGC-1]
1179 przechowuje pozosta³e argumenty wiersza poleceñ z wyj±tkiem opcji
1180 i ¼ród³a programu.
1181 Na przyk³ad, dla
1182 .nf
1183 .sp
1184         mawk  \-f  prog  v=1  A  t=hello  B
1185 .sp
1186 .fi
1187 .B ARGC
1188 = 5 oraz
1189 .B ARGV[0]
1190 = "mawk",
1191 .B ARGV[1]
1192 = "v=1",
1193 .B ARGV[2]
1194 = "A",
1195 .B ARGV[3]
1196 = "t=hello" i
1197 .B ARGV[4]
1198 = "B".
1199 .PP
1200 Nastêpnie wykonywany jest kolejno ka¿dy z bloków
1201 .BR BEGIN .
1202 Je¿eli program sk³ada siê wy³±cznie z bloków
1203 .BR BEGIN ,
1204 to na tym wykonywanie siê koñczy, w przeciwnym razie otwierany jest strumieñ
1205 wej¶ciowy i wykonywanie jest kontynuowane.
1206 Je¿eli
1207 .B ARGC
1208 równa siê 1,
1209 strumieñ wej¶ciowy ustawiany jest na stdin, w przypadku przeciwnym
1210 w poszukiwaniu argumentu plikowego sprawdzane s± argumenty wiersza poleceñ
1211 .BR ARGV[1]  " ..."
1212 .BR ARGV[ARGC-1] .
1213 .PP
1214 Argumenty wiersza poleceñ dziel± siê na trzy grupy:
1215 argumenty plikowe, argumenty przypisañ i ³añcuchy puste "".
1216 Przypisanie ma postaæ
1217 \fIzmn\fR=\fI³añcuch\fR.
1218 Podczas sprawdzania
1219 .B ARGV[i]
1220 jako mo¿liwego argumentu plikowego, je¶li jest ono puste to jest
1221 pomijane; je¶li jest argumentem typu przypisania, odbywa siê przypisanie
1222 warto¶ci zmiennej
1223 .I zmn
1224 a
1225 .B i
1226 zmienia siê na nastêpny argument; w pozosta³ych przypadkach
1227 .B ARGV[i]
1228 jest otwierane jako wej¶cie.
1229 Je¿eli otwarcie nie powiedzie siê, wykonywanie programu jest koñczone
1230 z kodem 2.
1231 Je¿eli ¿aden z argumentów wiersza poleceñ nie jest argumentem plikowym, to
1232 wej¶cie pochodzi z stdin.
1233 Getline w akcji
1234 .B BEGIN
1235 otwiera wej¶cie.  "\-" jako argument plikowy oznacza stdin.
1236 .PP
1237 Po otwarciu strumienia wej¶ciowego ka¿dy z rekordów wej¶cia sprawdzany jest
1238 z ka¿dym ze
1239 .IR wzorców ,
1240 a je¶li pasuje, to wykonywana jest
1241 .I akcja
1242 skojarzona z danym wzorcem.
1243 Wzorzec w postaci wyra¿enia pasuje je¶li jego warto¶ci± logiczn± jest prawda
1244 (zobacz koniec sekcji 2).
1245 Wzorzec
1246 .B BEGIN
1247 zestawiany jest przed rozpoczêciem odczytu wej¶cia,
1248 za¶ wzorzec
1249 .B END
1250 po przeczytaniu ca³ego wej¶cia.
1251 Wzorzec zakresu, \fIwyra¿1\fP\fB,\fP\fIwyra¿2\fP, dopasowuje
1252 ka¿dy rekord pomiêdzy rekordem pasuj±cym do
1253 .I wyra¿1
1254 a rekordem pasuj±cym do
1255 .I wyra¿2
1256 ³±cznie z nimi.
1257 .PP
1258 Po napotkaniu koñca pliku w strumieniu wej¶ciowym, sprawdzane s± pozosta³e
1259 argumenty wiersza poleceñ w poszukiwaniu kolejnego argumentu plikowego.
1260 Je¶li taki istnieje, to jest otwierany, w przeciwnym wypadku przyjmuje siê,
1261 ¿e zosta³ dopasowany
1262 .I wzorzec
1263 .B END
1264 i wykonywane s± wszystkie
1265 .I akcje
1266 .BR END .
1267 .PP
1268 W rozwa¿anym przyk³adzie, przypisanie
1269 v=1
1270 ma miejsce po wykonaniu
1271 .I akcji
1272 .BR BEGIN ,
1273 a dana umieszczona w
1274 v
1275 otrzymuje typ liczbowo-³añcuchowy.
1276 Nastêpnie z pliku A jest czytane wej¶cie.
1277 Po koñcu pliku A, zmienna
1278 t
1279 jest ustawiana na ³añcuch "hello", a B jest otwierany jako wej¶cie.
1280 Po osi±gniêciu koñca pliku B s± wykonywane
1281 .I akcje
1282 wzorca
1283 .BR END .
1284 .PP
1285 Przebieg programu na poziomie
1286 .I wzorzec
1287 .I {akcja}
1288 mo¿na zmieniæ przy pomocy instrukcji
1289 .nf
1290 .sp
1291      \fBnext
1292      \fBexit  \fIwyra¿-opcjonalne\fR.
1293 .sp
1294 .fi
1295 Instrukcja
1296 .B next
1297 powoduje, ¿e odczyt nastêpnego rekordu wej¶ciowego i ponowne sprawdzanie
1298 wzorców, od pierwszej pary
1299 .I "wzorzec {akcja}"
1300 programu.
1301 Polecenie
1302 .B  exit
1303 powoduje natychmiastowe wykonanie akcji
1304 .B END
1305 lub zakoñczenie programu, je¶li nie ma takich akcji lub je¿eli
1306 .B exit
1307 wyst±pi³o w akcji
1308 .BR END .
1309 .I wyra¿-opcjonalne
1310 ustawia warto¶æ kodu zakoñczenia programu, chyba ¿e zostanie ona przes³oniêta
1311 przez pó¼niejszy
1312 .B exit
1313 lub ujawniony potem b³±d.
1314 .SH PRZYK£ADY
1315 .nf
1316 1. emulacja cat.
1317
1318      { print }
1319
1320 2. emulacja wc.
1321
1322      { chars += length($0) + 1  # dodaje jeden dla \en
1323        words += NF
1324      }
1325
1326      END{ print NR, words, chars }
1327
1328 3. zliczanie niepowtarzaj±cych siê "faktycznych s³ów".
1329
1330      BEGIN { FS = "[^A-Za-z]+" }
1331
1332      { for(i = 1 ; i <= NF ; i++)  word[$i] = "" }
1333
1334      END { delete word[""]
1335            for ( i in word )  cnt++
1336            print cnt
1337      }
1338
1339 .fi
1340 4. sumowanie drugiego pola ka¿dego rekordu w oparciu
1341 o pierwsze pole.
1342 .nf
1343
1344      $1 ~ /credit\||\|gain/ { sum += $2 }
1345      $1 ~ /debit\||\|loss/  { sum \-= $2 }
1346
1347      END { print sum }
1348
1349 5. sortowanie pliku, porównywanie ³añcuchowe
1350
1351      { line[NR] = $0 "" }  # wymusza typ porównywania: gdyby
1352                            # jakie¶ wiersze wygl±da³y
1353                            # na numeryczne
1354
1355      END {  isort(line, NR)
1356        for(i = 1 ; i <= NR ; i++) print line[i]
1357      }
1358
1359      #sortowanie A[1..n] metod± wstawiania
1360      function isort( A, n,   i, j, hold)
1361      {
1362        for( i = 2 ; i <= n ; i++)
1363        {
1364          hold = A[j = i]
1365          while ( A[j\-1] > hold )
1366          { j\-\|\- ; A[j+1] = A[j] }
1367          A[j] = hold
1368        }
1369        # w razie potrzeby bêdzie utworzony wartownik A[0] = ""
1370      }
1371
1372 .fi
1373 .SH "KWESTIE ZGODNO¦CI"
1374 Posix-owa 1003.2 (propozycja 11.3) definicja jêzyka AWK jest AWK opisanym
1375 w ksi±¿ce AWK z kilkoma rozszerzeniami, jakie pojawi³y siê w nawk
1376 z SystemVR4. Rozszerzeniami tymi s±:
1377 .sp
1378 .RS
1379 Nowe funkcje: toupper() i tolower().
1380
1381 Nowe zmienne: ENVIRON[\|] i CONVFMT.
1382
1383 Specyfikacje konwersji w printf() i sprintf() wziête z ANSI C.
1384
1385 Nowe opcje polecenia:  \-v zmn=warto¶æ, wielokrotne opcje -f i opcje
1386 charakterystyczne dla implementacji jako argumenty \-W.
1387 .RE
1388 .sp
1389
1390 Posix-owy AWK przetwarza pojedyncze wiersze plików.
1391 .B RS
1392 mo¿na zmieniæ z "\en" na inny pojedynczy znak, ale trudno jest znale¼æ
1393 jakie¶ tego zastosowanie \(em w ksi±¿ce AWK brak odpowiednich przyk³adów.
1394 Zgodnie z konwencj±, \fBRS\fR = "", powoduje, ¿e jeden lub wiêcej pustych
1395 wierszy rozdziela rekordy, umo¿liwiaj±c obs³ugê rekordów wielowierszowych.
1396 Gdy \fBRS\fR = "", "\en" jest zawsze separatorem pól, niezale¿nie od warto¶ci
1397 .BR FS .
1398 .PP
1399 .BR mawk ,
1400 z kolei,
1401 pozwala by
1402 .B RS
1403 by³o wyra¿eniem regularnym.
1404 Pojawiaj±ce siê w rekordach "\en" jest traktowane jak odstêp, a
1405 .B FS
1406 zawsze okre¶la pola.
1407 .PP
1408 Pozbycie siê paradygmatu operowania pojedynczym wierszem mo¿e upro¶ciæ
1409 niektóre programy i czêsto poprawiæ wydajno¶æ. Na przyk³ad, zmienieniony
1410 przyk³ad 3 (zobacz powy¿ej),
1411 .nf
1412 .sp
1413         BEGIN { RS = "[^A-Za-z]+" }
1414
1415         { word[ $0 ] = "" }
1416
1417         END { delete  word[ "" ]
1418           for( i in word )  cnt++
1419           print cnt
1420         }
1421 .sp
1422 .fi
1423 zlicza ilo¶æ niepowtarzaj±cych siê s³ów przez
1424 traktowanie ka¿dego s³owa jako rekordu.
1425 Przy plikach ¶rednich rozmiarów
1426 .B mawk
1427 wykonuje go dwukrotnie szybciej, dziêki uproszczonej pêtli wewnêtrznej.
1428 .PP
1429 Poni¿szy program zastêpuje ka¿dy z komentarzy w pliku programu C
1430 pojedyncz± spacj±,
1431 .nf
1432 .sp
1433         BEGIN {
1434           RS = "/\|\e*([^*]\||\|\e*+[^/*])*\e*+/"
1435                 # komentarz jest separatorem rekordów
1436           ORS = " "
1437           getline  hold
1438        }
1439
1440        { print hold ; hold = $0 }
1441
1442        END { printf "%s" , hold }
1443 .sp
1444 .fi
1445 Buforowanie rekordu jest niezbêdne, by unikn±æ zakoñczenia ostatniego
1446 z rekordów spacj±.
1447 .PP
1448 W
1449 .B mawk
1450 poni¿sze wyra¿enia s± równowa¿ne,
1451 .nf
1452 .sp
1453         x ~ /a\e+b/    x ~ "a\e+b"     x ~ "a\e\e+b"
1454 .sp
1455 .fi
1456 Powy¿sze ³añcuchy bêd± analizowane dwukrotnie: raz jako ³añcuch i raz jako
1457 wyra¿enie regularne. Przy analizie ³añcucha
1458 .B mawk
1459 ignoruje stosowanie cytowania odwrotnym uko¶nikiem do znaków nie bêd±cych
1460 znakami specjalnymi, zatem
1461 .I \ec
1462 interpretuje jako
1463 .IR \ec .
1464 Natomiast ksi±¿ka AWK przychyla siê do tego, by
1465 .I \ec
1466 by³o rozpoznawane jako
1467 .IR c ,
1468 co wymaga podwojonego cytowania metaznaków w ³añcuchach.
1469 Posix wprost odmawia zdefiniowania po¿±danego zachowania, przez co
1470 po¶rednio wymusza na programach musz±cych dzia³aæ z ró¿nymi wersjami
1471 awk stosowanie bardziej przeno¶nego, lecz mniej czytelnego, cytowania
1472 z u¿yciem podwójnych odwrotnych uko¶ników.
1473 .PP
1474 Posix-owy AWK nie rozpoznaje "/dev/std{out,err}" ani sekwencji
1475 specjalnej \ex hex w ³añcuchach. W przeciwieñstwie do ANSI C,
1476 .B mawk
1477 ogranicza liczbê cyfr, jakie mog± wystêpowaæ po \ex do dwóch, gdy¿ obecna
1478 implementacja obs³uguje tylko znaki 8-bitowe.
1479 Wbudowane
1480 .B fflush
1481 pojawi³o siê po raz pierwszy w ostatnim (1993) awk AT&T wydanym dla netlib,
1482 i nie jest czê¶ci± standardu Posix. Ca³o¶ciowe usuwanie tablicy przez
1483 .B delete
1484 .I tablica
1485 nie jest czê¶ci± standardu Posix.
1486 .PP
1487 Posix jawnie zostawia niezdefiniowane zachowanie siê
1488 .B FS
1489 = "" i wspomina o podziale rekordów na znaki jako
1490 mo¿liwej interpretacji, ale obecnie takie zastosowanie nie jest przeno¶ne
1491 miêdzy implementacjami.
1492 .PP
1493 Na koniec, sposób w jaki
1494 .B mawk
1495 obs³uguje przypadki wyj±tkowe nie opisane w ksi±¿ce AWK ani w propozycji
1496 Posix. Niebezpiecznie jest zak³adanie spójno¶ci pomiêdzy implementacjami
1497 awk, a bezpiecznie przej¶æ do nastêpnej sekcji.
1498 .PP
1499 .RS
1500 substr(s, i, n) zwraca znaki ³añcucha s o pozycjach z czê¶ci wspólnej
1501 przedzia³u zamkniêtego [1, length(s)] i pó³otwartego [i, i+n).  Gdy
1502 czê¶æ wspólna jest pusta, zwracany jest ³añcuch pusty; zatem
1503 substr("ABC", 1, 0) = "" a substr("ABC", \-4, 6) = "A".
1504 .PP
1505 Ka¿dy ³añcuch, nawet pusty, pasuje pocz±tkiem do ³añcucha pustego, wiêc
1506 s ~ // i s ~ "", s± zawsze równe 1, tak jak match(s, //) i match(s, "").
1507 Ostanie dwa ustawiaj±
1508 .B RLENGTH
1509 na 0.
1510 .PP
1511 index(s, t) jest zawsze tym samym, co match(s, t1), gdzie t1, to to samo, co
1512 t z cytowanymi metaznakami. St±d spójno¶æ z match wymaga, by index(s, "")
1513 zawsze zwraca³o 1.
1514 Równie¿ warunek: index(s,t) != 0 wtedy i tylko wtedy, gdy t jest pod³añcuchem
1515 ³añcucha s, wymusza by index("","") = 1.
1516 .PP
1517 Je¿eli getline napotka koniec pliku, getline zmn pozostawia zmienn± zmn
1518 bez zmian. Podobnie, w momencie rozpoczêcia akcji
1519 .BR END ,
1520 warto¶ci
1521 .BR $0 ,
1522 pól i
1523 .B NF
1524 pozostaj± niezmienione od ostatniego rekordu.
1525 .SH ZOBACZ TAK¯E
1526 .BR egrep (1)
1527 .PP
1528 Aho, Kernighan and Weinberger,
1529 .IR "The AWK Programming Language" ,
1530 Addison-Wesley Publishing, 1988, (ksi±¿ka AWK),
1531 definiuje jêzyk, rozpoczynaj±c siê samouczkiem a dochodz±c do wielu
1532 interesuj±cych programów i wchodz±c g³êboko w kwestie projektowania
1533 i analizy programów istotne przy programowaniu w ka¿dym jêzyku.
1534 .PP
1535 .IR "The GAWK Manual" ,
1536 The Free Software Foundation, 1991, stanowi podrêcznik i opis
1537 jêzyka nie usi³uj±cy siêgn±æ g³êbi ksi±¿ki AWK. Zak³ada, ¿e
1538 czytelnik mo¿e byæ pocz±tkuj±cym programist±. Sekcja po¶wiêcona tablicom
1539 w AWK jest doskona³a. Omawia tak¿e wymagania stawiane AWK przez Posix.
1540 .SH B£ÊDY
1541 .B mawk
1542 nie obs³uguje znaku ascii NUL \e0 w plikach ¼ród³owych czy plikach danych.
1543 Mo¿na wypisaæ NUL przy pomocy printf z %c, a w wej¶ciu
1544 s± dopuszczalne wszystkie inne znaki 8-bitowe.
1545 .PP
1546 .B mawk
1547 implementuje printf() i sprintf() przy pomocy funkcji bibliotecznych C,
1548 printf i sprintf, wiêc pe³na zgodno¶æ z ANSI wymaga biblioteki ANSI C.
1549 W praktyce oznacza to, ¿e kwalifikator konwersji h mo¿e nie byæ dostêpny.
1550 .B mawk
1551 przejmuje te¿ wszystkie b³êdy czy ograniczenia tych funkcji.
1552 .PP
1553 Twórcy implementacji jêzyka AWK ukazali zgodny brak wyobra¼ni
1554 w nazywaniu swych programów.
1555 .SH AUTOR
1556 Mike Brennan (brennan@whidbey.com).
This page took 0.129703 seconds and 3 git commands to generate.