lo dvoetochij = 5
CHislo tochek s zapyatoj = 6
CHislo slov = 50
CHislo simvolov v slovah = 150
CHislo predlozhenij = 10
Srednyaya dlina predl. = 5 (slov)
Srednyaya dlina slova = 3
6. Vvod i vyvod dannyh v AWK-programmah
Vvod dannyh v AWK-programmu opredelyaetsya imenem vhod-
nogo fajla v komandnoj stroke. Takih fajlov mozhet byt' nes-
kol'ko, i obrabatyvat'sya AWK-programmoj oni budut posledova-
tel'no v tom poryadke, v kotorom ukazany v komandnoj stroke,
naprimer:
awk -f prog f1 f2 f3 f4
AWK-programma iz fajla prog budet vypolnyat'sya nad vhodnym
potokom zapisej iz fajlov f1, f2, f3 i f4. Zdes' neobhodimo
otmetit', chto predopredelennaya peremennaya NR budet imet'
znachenie, ravnoe poryadkovomu nomeru zapisi ( NR ne obnulya-
etsya pri perehode k chteniyu ocherednogo fajla). Pust' imeyutsya
chetyre fajla. Fajl f1:
a[1][1] a[1][2] a[1][3] a[1][4]
a[2][1] a[2][2] a[2][3] a[2][4]
a[3][1] a[3][2] a[3][3] a[3][4]
a[4][1] a[4][2] a[4][3] a[4][4]
Fajl f2:
b[1][1] b[1][2] b[1][3] b[1][4]
b[2][1] b[2][2] b[2][3] b[2][4]
b[3][1] b[3][2] b[3][3] b[3][4]
b[4][1] b[4][2] b[4][3] b[4][4]
Fajl f3:
c[1][1] c[1][2] c[1][3] c[1][4]
c[2][1] c[2][2] c[2][3] c[2][4]
c[3][1] c[3][2] c[3][3] c[3][4]
c[4][1] c[4][2] c[4][3] c[4][4]
Fajl f4:
- 26 -
d[1][1] d[1][2] d[1][3] d[1][4]
d[2][1] d[2][2] d[2][3] d[2][4]
d[3][1] d[3][2] d[3][3] d[3][4]
d[4][1] d[4][2] d[4][3] d[4][4]
Kazhdyj iz etih fajlov vklyuchaet po chetyre zapisi (po chetyre
polya v kazhdoj). Drugimi slovami, kazhdyj fajl - matrica
(4*4). Dopustim, neobhodimo poluchit' novuyu matricu s raz-
mernost'yu (4*4), stolbcy kotoroj sostavleny iz elementov
diagonalej ishodnyh matric. Nizhe priveden tekst programmy, v
kotoroj reshaetsya eta zadacha:
{
if( FILENAME != Name ) {
i = 0;
Name = FILENAME;
}
i++;
if( i == 1 ) {
Dig1 = Dig1 " " $1;
next;
}
if( i == 2 ) {
Dig2 = Dig2 " " $2;
next;
}
if( i == 3 ) {
Dig3 = Dig3 " " $3;
next;
}
if( i == 4 ) Dig4 = Dig4 " " $4;
}
END {
print( Dig1 );
print( Dig2 );
print( Dig3 );
print( Dig4 );
}
V programme dva pravila. Pervoe pravilo ne soderzhit
selektora, sledovatel'no, vypolnyaetsya dlya vseh vhodnyh zapi-
sej. Vtoroe pravilo vypolnyaetsya po zaversheniyu vhodnogo
potoka. Programma rabotaet sleduyushchim obrazom: pervonachal'no
proveryaetsya, izmenilos' li imya vhodnogo fajla (predoprede-
lennaya peremennaya FILENAME), zatem, esli ne izmenilos',
prisvaivaetsya znachenie sootvetstvuyushchego polya zapisi k pere-
mennoj Dig (ispol'zuetsya operaciya konkatenacii starogo zna-
cheniya Dig so znacheniem polya i prisvaivaniya Dig novogo znache-
niya). Peremennaya Name prednaznachena dlya sohraneniya imeni
vhodnogo fajla. Pervonachal'no znacheniya peremennyh Name i Dig
- 27 -
ravny pustym strokam. Vazhno, chto my znaem tochno chislo zapi-
sej, eto pozvolyaet vydelyat' nuzhnye polya v zapisyah. Dopus-
tim, vypolnyaetsya sleduyushchaya komandnaya stroka:
awk -f prog f1 f2 f3 f4 >> Result
v fajle Result budem imet':
a[1][1] b[1][1] c[1][1] d[1][1]
a[2][2] b[2][2] c[2][2] d[2][2]
a[3][3] b[3][3] c[3][3] d[3][3]
a[4][4] b[4][4] c[4][4] d[4][4]
Rezul'tat raboty programmy sushchestvenno svyazan s poryadkom
chteniya vhodnyh fajlov. Esli vypolnit' komandnuyu stroku
awk -f prog f4 f3 f2 f1 >> Result
poluchim:
d[1][1] c[1][1] b[1][1] a[1][1]
d[2][2] c[2][2] b[2][2] a[2][2]
d[3][3] c[3][3] b[3][3] a[3][3]
d[4][4] c[4][4] b[4][4] a[4][4]
Kogda voznikaet neobhodimost' peredat' v AWK-programmu
znacheniya nekotoryh peremennyh, mozhno vospol'zovat'sya vozmozh-
nost'yu ukazat' ih v fajle. Dopustim, zaranee ne izvestny
obrazcy dlya vydeleniya zapisej fajla f1. V etom sluchae mozhno
sozdat' fajl f0 s opisaniyami obrazcov i, vospol'zovavshis'
znacheniem peremennoj FILENAME, prisvoit' etim peremennym
nuzhnye znacheniya. Pust' fajl f0 imeet vid:
aaa bbb ccc
Pust' fajl f1 imeet vid:
aaa bbb ccc ddd eee
eee bbb ccc ddd aaa
aaa fff ccc ddd eee
aaa bbb ggg ttt eee
Programma na AWK:
- 28 -
FILENAME == "f0" {
pat1 = $1;
pat2 = $2;
pat3 = $3;
next;
}
$1 == pat1 { print; next }
$2 == pat2 { print; next }
$3 == pat3 { print }
Posle vypolneniya komandnoj stroki
awk -f prog f0 f1
poluchim v fajle Result:
aaa bbb ccc ddd eee
aaa fff ccc ddd eee
aaa bbb ggg ttt eee
Mozhno predusmotret' vvod peremennyh so standartnogo
vvoda; vospol'zuemsya tem, chto peremennaya FILENAME dlya stan-
dartnogo vvoda opredelena kak "-". Pust' fajl f1 imeet vid:
aaa bbb ccc ddd eee
eee bbb ooo ddd aaa
aaa fff ccc ddd eee
qqq bbb ggg ttt eee
ooo fff ggg ttt eee
ccc bbb ggg ttt eee
Privedennaya nizhe programma pozvolyaet poluchit' znacheniya pere-
mennyh s klaviatury displeya:
BEGIN { print("Vvodite znacheniya polej:"); }
FILENAME == "-" {
pat1 = $1;
pat2 = $2;
pat3 = $3;
}
FILENAME == "f1" {
if($1 == pat1) { print($0); next }
if($2 == pat2) { print($0); next }
if($3 == pat3) { print($0);}
}
Posle zapuska na vypolnenie sleduyushchej komandnoj stroki
awk -f prog - f1
- 29 -
programma budet zhdat' vvoda s klaviatury displeya (zavershit'
vvod neobhodimo simvolom konec fajla - CTRL/D). Naprimer:
Vvodite znacheniya polej:
qqq fff ooo
CTRL/D
eee bbb ooo ddd aaa
aaa fff ccc ddd eee
qqq bbb ggg ttt eee
ooo fff ggg ttt eee
Kak uzhe govorilos' ran'she, vyvod AWK-programmy naprav-
lyaetsya na ekran displeya, esli ne bylo ukazano drugoe.
Sushchestvuet vozmozhnost' napravit' vyvod po neskol'kim kanalam
neposredstvenno iz AWK-programmy, dlya etogo mozhno vospol'zo-
vat'sya standartnymi sredstvami sistemy DEMOS. Naprimer:
print( $0 ) >> "file";
zapis' budet napravlena v fajl s imenem ./file;
print( $0 ) >>>> "file";
zapis' budet dopisana v ./file;
print( $0 ) >> $2;
zapis' budet napravlena v fajl s imenem, ravnym soderzhimomu
ee vtorogo polya.
Sushchestvuet vozmozhnost' iz AWK-programmy napravit' vyvod
v konvejer, naprimer:
{
print($0) | "tr ' ' '\n' | sort ";
}
Zdes' zapis' budet napravlena komande tr, kotoraya zamenit
probel simvolom '\n', zatem otsortirovana komandoj sort.
Pust' vypolnena sleduyushchaya komandnaya stroka:
awk -f prog -
posle vvoda s klaviatury neskol'kih zapisej
dfa nrk klm njf rty xvz
saa ass dcf vfr klm ttr
CTRL/D
poluchim:
- 30 -
ass
dcf
dfa
klm
klm
njf
nrk
rty
saa
ttr
vfr
xvz
Vyvod rezul'tata raboty konvejera osushchestvlyaetsya po zavershe-
niyu chteniya poslednej vhodnoj zapisi. Kanal vyvoda v primere
sovpadaet s kanalom standartnogo vyvoda, no ego mozhno pere-
opredelit' na lyuboj fajl.
V odnoj AWK-programme mozhno odnovremenno opredelit'
neskol'ko kanalov vyvoda, chislo kotoryh zavisit ot chisla
fajlov, razreshennyh dlya odnovremennogo ispol'zovaniya. |to
chislo ustanavlivaetsya pri generacii operacionnoj sistemy
DEMOS.
Dlya vyvoda dannyh v AWK-programme prednaznachen operator
print. Do nastoyashchego momenta my primenyali lish' odnu formu
ispol'zovaniya etogo operatora:
print(spisok_fakticheskih_parametrov);
Kruglye skobki ispol'zovalis' ran'she dlya togo, chtoby ne otv-
lekat' chitatelya, znakomogo s yazykom programmirovaniya Si, -
ih mozhno ne ukazyvat'. Sushchestvuyut i drugie formy ispol'zova-
niya etogo operatora:
print;
vyvoditsya vsya zapis';
print $1, $2;
znacheniya polej vyvodyatsya cherez probel;
print $1 $2;
vyvoditsya konkatenaciya znachenij polej.
Pri neobhodimosti upravleniya formatom vyvoda mozhno
ispol'zovat' bibliotechnuyu funkciyu printf, sintaksis i
rezul'tat raboty kotoroj takie zhe, kak i v yazyke Si.
7. Ispol'zovanie vstroennyh funkcij
- 31 -
Interpretator awk vklyuchaet nabor vstroennyh funkcij,
kotorye mozhno ispol'zovat' v dejstviyah pravil. Sushchestvuyut
dva sposoba vyzova vstroennyh funkcij:
imya_funkcii(spisok_fakticheskih_parametrov)
imya_funkcii
Vo vtorom sluchae v kachestve fakticheskogo parametra primenya-
etsya vsya tekushchaya zapis'. Kak obychno, znachenie funkcii pods-
tavlyaetsya v vyrazhenie v tom meste, gde opredelen vyzov.
Imeyutsya sleduyushchie vstroennye funkcii:
length(vyrazhenie)
znacheniem vyrazheniya yavlyaetsya stroka. Funkciya length
vozvrashchaet dlinu stroki, naprimer:
print( length($1 " " $2));
budet napechatana dlina stroki, poluchennoj konkatenaciej
polya $1, probela i polya $2. Forma bez argumenta vozv-
rashchaet dlinu zapisi.
exp(vyrazhenie)
vozvrashchaet eksponentu ot vyrazheniya.
log(vyrazhenie)
vozvrashchaet natural'nyj logarifm vyrazheniya.
sqrt(vyrazhenie)
vozvrashchaet znachenie kvadratnogo kornya ot vyrazheniya.
int(vyrazhenie)
vozvrashchaet celuyu chast' chisla, ravnogo znacheniyu vyrazhe-
niya.
substr(S, M, N)
vozvrashchaet chast' stroki S, nachinayushchuyusya ot pozicii M i
imeyushchuyu dlinu ne bolee N simvolov. Simvoly v stroke S
numeruyutsya s 1. Esli argument N ne ukazan, vozvrashcha-
yutsya vse simvoly ot M do konca stroki.
string = substr( $0, 12, 20);
String budet vklyuchat' 9 simvolov (s 12 po 20) tekushchej
zapisi.
index(As, Ps)
vozvrashchaet nomer pozicii, s kotoroj stroka Ps sovpadaet
so strokoj As. Esli sovpadeniya net, vozvrashchaetsya 0.
- 32 -
sprintf(format, vyrazhenie, ...)
vozvrashchaet stroku, vyvedennuyu po formatu. Sintaksis
funkcii i rezul'tat raboty analogichny funkcii sprintf v
biblioteke yazyka programmirovaniya Si.
split( S, Name, razdelitel' )
stroka S razbivaetsya na polya, znacheniya kotoryh prisvai-
vayutsya elementam massiva Name. Znacheniem pervogo ele-
menta Name[1] budet soderzhimoe pervogo vydelennogo
polya, znacheniem vtorogo elementa Name[2] - vtorogo
vydelennogo polya i tak dalee. Esli ne ukazan razdeli-
tel' polej, ispol'zuetsya znachenie predopredelennoj
peremennoj FS. Funkciya split vozvrashchaet chislo vydelen-
nyh polej. Rassmotrim primer. Pust' imeetsya fajl f1
aaa bbb ccc# ddd# eee fff# ggg
ttt# ggg eee# ccc ddd sss# yyy
i AWK-programma
{
i = split( $0, Name, "#");
for(j = 1; j <<= i; j++)
print( "Name["j"] =", Name[j]);
}
posle vypolneniya komandnoj stroki
awk -f prog f1
poluchim:
Name[1] = aaa bbb ccc
Name[2] = ddd
Name[3] = eee fff
Name[4] = ggg
Name[1] = ttt
Name[2] = ggg eee
Name[3] = ccc ddd sss
Name[4] = yyy
- 33 -
SODERZHANIE
Annotaciya ......................................... 2
1. Principy raboty interpretatora awk ................ 3
2. Peremennye, vyrazheniya i prisvaivaniya v AWK-
programmah ........................................ 7
3. Struktura AWK-programmy ........................... 13
4. Selektory ......................................... 16
5. Dejstviya .......................................... 22
6. Vvod i vyvod dannyh v AWK-programmah .............. 26
7. Ispol'zovanie vstroennyh funkcij .................. 31
- 34 -