[ Pobierz całość w formacie PDF ]
tością zmiennej RS.
W tradycyjnej implementacji awk, tudzież wedle specyfikacji POSIX, zmienna RS musi być al-
bo pojedynczym znakiem, na przykład znakiem nowego wiersza (to wartość domyślna RS),
albo ciągiem pustym. W tym ostatnim przypadku stosowana jest specjalna interpretacja sepa-
ratora rekordów: na rekordy składają się wtedy całe akapity tekstu, czyli grupy wierszy roz-
dzielane jednym bądz kilkoma wierszami pustymi; puste wiersze na początku i końcu pliku
są wtedy ignorowane. Pola w tak grupowanych rekordach są oddzielane znakami nowego
wiersza albo dowolnym innym separatorem definiowanym wartością zmiennej FS.
256 | Rozdział 9. Nieuzbrojony a niebezpieczny awk
W gawk i mawk model ten doczekał się istotnego rozszerzenia: RS może określać wyrażenie
regularne i może wtedy obejmować więcej niż jeden znak. Ustawienie RS = "+" ustala w roli
separatora rekordów znak plusa, ale już RS = ":+" dopasowuje separator w postaci jednego
bądz wielu sąsiadujących znaków dwukropka. Daje to możliwość zdecydowanie elastycz-
niejszego wyodrębniania rekordów kilka przykładów zastosowań wyrażeń regularnych
w roli separatorów pól znajdzie się w podrozdziale 9.6.
Jeśli separator pól jest wyrażeniem regularnym, to nie sposób wnioskować o tekście dopaso-
wanym do wzorca separatora z samej zmiennej RS. W gawk przewidziano więc dodatkową
zmienną wbudowaną RT, ustawianą po wczytaniu każdego rekordu na ciąg dopasowany do
wzorca separatora (w mawk jej nie ma).
Przy braku implementacji separatorów rekordów w formie wyrażeń regularnych symulowanie
takiej możliwości nie jest proste, zwłaszcza jeśli takie wyrażenia miałyby dopasowywać ciągi
przekraczające granice wierszy wszak większość narzędzi uniksowych operuje właśnie
wierszami. Można pokusić się o zastosowanie polecenia tr do zamiany znaku nowego wier-
sza na inny, niewykorzystywany znak, scalając strumień danych wejściowych do postaci jed-
nego gigantycznego wiersza. Wtedy mogą jednak ujawnić się rozmaite ograniczenia wynika-
jące z niewystarczających rozmiarów buforów przydzielanych dla przetwarzanych wierszy w
owych narzędziach. Na tym tle gawk, mawk i emacs wyróżniają się jako narzędzia nie narzuca-
jące wierszowej orientacji przetwarzanych danych.
9.4.2. Separatory pól
Pola w rekordzie są wyodrębniane przez dopasowanie bieżącego wyrażenia regularnego przy-
pisanego do wbudowanej zmiennej FS, która pełni rolę separatora pól.
Domyślna wartość FS to pojedyncza spacja, ale nie jest ona interpretowana dosłownie: sepa-
rator domyślny obejmuje dowolną (niezerową) liczbę znaków odstępów (spacji, tabulacji); wy-
odrębniane pola są obierane ze spacji poprzedzających i uzupełniających właściwą wartość
pola. Stąd dla programu awk rekordy:
alfa beta gamma
alfa beta gamma
są (przy założeniu domyślnego ustawienia FS) identyczne oba składają się z trzech pól
o wartościach "alfa", "beta" i "gamma". To szczególnie cenne, kiedy dane wejściowe są przy-
gotowywane przez ludzi.
Jeśli zachodzi potrzeba, aby pola były separowane dokładnie jednym znakiem spacji, należy
wykonać przypisanie FS = "[ ]". Przy tak określonym separatorze spacje poprzedzające
i uzupełniające podciąg znaków drukowalnych wejdą do podciągu właściwej wartości pola.
Można to sprawdzić na poniższych przykładach wykrywających w identycznym wierszu (roz-
poczynającym się i kończącym parą spacji) wejściowym różne ilości pól:
$ echo ' raz dwa trzy ' | awk -F' ' '{ print NF ":" $0 }'
3: raz dwa trzy
$ echo ' raz dwa trzy ' | awk -F'[ ]' '{ print NF ":" $0 }'
7: raz dwa trzy
W drugim wywołaniu awk doliczył się siedmiu pól: "", "", "raz", "dwa", "trzy", "" i "".
9.4. Rekordy i pola | 257
Zmienna FS jest traktowana jak wyrażenie regularne tylko wtedy, kiedy zawiera więcej niż
jeden znak. Ustawienie FS = "." oznacza więc wybranie do roli separatora pól znaku kropki;
nie jest to w żadnym razie interpretowane jako wyrażenie regularne dopasowujące dowolny znak.
We współczesnych implementacjach awk dopuszcza się też puste wartości FS. Wtedy każdy
znak stanowi osobne pole rekordu. Z kolei w starszych implementacjach przypisanie ciągu
pustego do FS to rezygnacja z wyodrębniania pól każdy rekord ma wtedy tylko jedno pole,
rozciągające się na całość rekordu. POSIX mówi zaś jedynie, że zachowanie programu dla
pustej wartości separatora pól jest nieokreślone.
9.4.3. Pola
Pola bieżącego rekordu są w programie awk dostępne za pośrednictwem specjalnych symboli:
$1, $2, $3, ..., $NF. Indeksy symboli nie muszą być literałami (stałymi) mogą być obliczane
dynamicznie; w takim przypadku będą w razie potrzeby obcinane do wartości całkowitych.
Dla k równego 3 to zarówno $k, jak i $(1+2), $(27/9), $3.14159 jak i $"3.14159" i wreszcie
$3 będą odwołaniami do trzeciego pola bieżącego rekordu.
Symbol $0 odnosi się do całego bieżącego rekordu wejściowego w postaci odczytanej ze stru-
mienia wejściowego, po obcięciu znaków (podciągów) separatora rekordów. Odwołania do
[ Pobierz całość w formacie PDF ]