AWK mindenkinek

Egyik kedvenc programom az AWK. Nagy örömömre szolgál, hogy Linux, Unix és MS-DOS alatt is rendelkezésre áll, így a munkahelyi és az otthoni munkáknál egyaránt hasznát veszem. Ez az egyszerű programnyelv elsősorban listák (ASCII fájlok) feldolgozásához készült, de - mint majd látni fogjuk - egyszerűbb számolásokhoz is jól használható.

Az AWK program filozofiája az, hogy a megadott fájlokat (vagy ennek hiányában a standard input-ot) soronként beolvassa, s a programban előírt szűrőfeltételek szerint valamilyen tevékenységet elvégez - vagy az illető rekordot átugorja. Mintegy "mellékesen" a beolvasott sort automatikusan tokenizálja (szavakra bontja), s ha ehhez még azt is hozzávesszük, hogy az egyszerűbb programoknál nem kell az adatfájlok megnyitásával és lezárásával bíbelődni, akkor nyilvánvaló, hogy ez a lusta programozók ideális eszköze!

Az AWK program dokumentációja Linux (és UNIX) alatt a man awk paranccsal érhető el, de érdemes begyűjteni (és kibontani) a SimTel MS-DOS gyűjteményben található awk320.zip fájlt is. Ez utóbbit használom DOS alatt, s a bőséges dokumentáció (awk.doc, awk.man) mellett számos mintaprogramot is tartalmaz.

Válogassunk!

Szegény ember vízzel főz - azaz programjait FTP gyűjteményekből szerzi be. Persze ember legyen a talpán, aki a bőség zavarával meg tud birkózni. Itt a lista (pl. a SimTel gyűjteményekben megszokott 00_index.txt), amott a programkönyvtár - hogy csináljuk a válogatást? Egyik (valóban primitív!) módszerem az, hogy gondosan átnézem a programkínálatot (az egysoros, rövidke magyarázattal megtűzdelt fájllistát), s egy egy + jelet teszek annak a sornak az elejére, amelyik megtetszik (t.i.: szövegszerkesztővel böngészem a listát...). Ezután csak annyi mondok, hogy:

awk '/^\+/ {print}' 00_index.txt > selected.txt

A kiválogatott fájlok listája máris előállt. Az pedig már csupán fantázia kérdése, hogy az egyszerű kilistázás helyett (vagy mellett) a kiválasztott fájlok FTP-zésére vagy másolására szolgáló batch fájlt (shell scriptet) is előállitsuk a fönti {print} "megcifrázásával".

Adatkonverzió

Nézzünk egy picit bonyolultabb feladatot: készítsünk egy táblázatból három másikat úgy, hogy közben koordináta transzformációt végzünk, mértékegységet váltunk és a táblázat oszlopainak szélességét és sorrendjét is megváltoztatjuk - mint ahogy bizonyára kitalálták - a táblázatokat bemenő adatként felhasználó programok igényei szerint.

A kiinduló táblázat egy kristály elemi cellájában található 12 db. atom koordinátáit tartalmazza - cellaméret egységekben. A mintának választott kristály (Na2SO3) sajnos hexagonális, így a rendelkezésre álló koordináták ferdeszögű koordinátarendszerben vannak megadva.

Az első eredményfájl úgynevezett XYZ adatfájl lesz, ami pl. az Xmol, Rasmol, Molwin és hasonló programok által felismert adatformátum. Ebben az Angströmben megadott koordinátákat egy kétsoros fejléc előzi meg (atomok száma és egy címsor).

A második és a harmadik eredményfájl a DVscat nevű DV-Xa molekula modellező programhoz szükséges. Hogy ne unatkozzunk, a második eredményfájlban derékszögű rendszerben és atomi egységben kell megadni a koordinátákat, mig a harmadikban - a bemenő fájlhoz hasonlóan - ferdeszögű rendszerben és cella egységeket használva kell megadni az atomok pozícióját.

1. táblázat A kiindulási adatsor (egy elemi cella két Na2SO3 egységet tartalmaz, s az egységcella oldalai: a = b = 5.4587 A; c=6.1792 A)

atom    x/a      y/b      z/c

S1    0.33333  0.66666  0.1730
S2   -0.33333 -0.66666 -0.1730
O3    0.1313   0.38200  0.2683
O4   -0.1313  -0.38200 -0.2683
O5    0.3820   0.25070 -0.2683
O6   -0.3820  -0.25070  0.2683
O7    0.2507  -0.1313   0.2683
O8   -0.2507   0.1313  -0.2683
Na9   0        0        0
Na10  0        0        0.5
Na11  0.33333  0.66666  0.66666
Na12 -0.33333 -0.66666 -0.66666

A feladatot az alábbi programocskával oldottam meg, melyet így kell futtatni:

awk -f so3.awk Na2SO3

ahol Na2SO3 az 1. táblázatban kilistázott adatokat tartalmazza (fejléc nélkül), so3.awk az itt látható program, s az eredmény pedig a Na2SO3.xyz, Na2SO3.f05 és Na2SO3.f03 fájlokba kerül.

Az so3.awk program listája

#Átszámolja a hexagonális Na2SO3 kristály egy elemi cellájában 
#levő atomok koordinátáit Descartes koordináta rendszerre.
# cx=cos 120 degs 
# cy=sin 120 degs
# x,y,z    ferdeszögű koordináták cella egységben
# xa,yb,zc Descartes koordináták (Angström egységekben)
# au       konverziós faktor az atomi hosszegység és az Angström között
# cella méret: a=5.4587 A ; c=6.1792 A

# Az első rekord beolvasásakor végezzük el az inicializálásokat
# Ezek egyrészét a BEGIN szekcióba is tehettük volna, 
# de a FILENAME változó ott még nem áll rendelkezésre!!!
NR==1 { a=5.4587; c=6.1792
        cx=-0.5;  cy=0.8660254
        au=0.529177
# Háromféle adatfájlt készítünk
        f1= FILENAME ".xyz"
        f2= FILENAME ".f05"
        f3= FILENAME ".f03"
# Az XYZ eredményfájl elejére fejlécet is írunk
        print 12 > f1
        print FILENAME " unit cell" >> f1
      }

# Az alábbi műveleteket minden beolvasott rekordra elvégezzük
      {
# A negtív koordinátákat eltolással a pozitív térnyolcadba transzformáljuk 
        x=$2; if (x<0) x=x+1
        y=$3; if (y<0) y=y+1
        z=$4; if (z<0) z=z+1
# Az egységcellát az origóra centráljuk
        x=x-0.5
        y=y-0.5
        z=z-0.5
# A ferdeszögű koordinátákat derékszögűvé transzformáljuk
        xa=(x+cx*y)*a
        yb=y*cy*a
        zc=z*c
# A koordinátákat és az atom nevét mindhárom fájlba kiírjuk
        printf("%-4s %8.5f %8.5f %8.5f\n", $1,xa,yb,zc) >> f1
        printf("%20.10E%20.10E%20.10E%5s\n", xa/au,yb/au,zc/au,$1) >> f2
        printf("%20.10E%20.10E%20.10E%5s\n", x,y,z,$1) >> f3
      }

Az Na2SO3.xyz eredményfájl listája

12
Na2SO3 unit cell
S1   -1.36468  0.78786 -2.02060
S2    1.36468 -0.78786  2.02060
O3   -1.69056 -0.55783 -1.43172
O4    1.69056  0.55783  1.43172
O5    0.03630 -1.17853  1.43172
O6   -0.03630  1.17853 -1.43172
O7   -2.36717  1.74298 -1.43172
O8    2.36717 -1.74298  1.43172
Na9  -1.36468 -2.36369 -3.08960
Na10 -1.36468 -2.36369  0.00000
Na11 -1.36468  0.78786  1.02983
Na12  1.36468 -0.78786 -1.02983

Az Na2SO3.f05 eredményfájl listája

    -2.578863027E+00     1.488847700E+00    -3.818379106E+00   S1
     2.578863027E+00    -1.488847700E+00     3.818379106E+00   S2
    -3.194695518E+00    -1.054146337E+00    -2.705560975E+00   O3
     3.194695518E+00     1.054146337E+00     2.705560975E+00   O4
     6.859775652E-02    -2.227107474E+00     2.705560975E+00   O5
    -6.859775652E-02     2.227107474E+00    -2.705560975E+00   O6
    -4.473295807E+00     3.293760632E+00    -2.705560975E+00   O7
     4.473295807E+00    -3.293760632E+00     2.705560975E+00   O8
    -2.578863027E+00    -4.466721769E+00    -5.838500162E+00  Na9
    -2.578863027E+00    -4.466721769E+00     0.000000000E+00 Na10
    -2.578863027E+00     1.488847700E+00     1.946088874E+00 Na11
     2.578863027E+00    -1.488847700E+00    -1.946088874E+00 Na12

Az Na2SO3.f03 eredményfájl listája

 
    -1.666700000E-01     1.666600000E-01    -3.270000000E-01   S1
     1.666700000E-01    -1.666600000E-01     3.270000000E-01   S2
    -3.687000000E-01    -1.180000000E-01    -2.317000000E-01   O3
     3.687000000E-01     1.180000000E-01     2.317000000E-01   O4
    -1.180000000E-01    -2.493000000E-01     2.317000000E-01   O5
     1.180000000E-01     2.493000000E-01    -2.317000000E-01   O6
    -2.493000000E-01     3.687000000E-01    -2.317000000E-01   O7
     2.493000000E-01    -3.687000000E-01     2.317000000E-01   O8
    -5.000000000E-01    -5.000000000E-01    -5.000000000E-01  Na9
    -5.000000000E-01    -5.000000000E-01     0.000000000E+00 Na10
    -1.666700000E-01     1.666600000E-01     1.666600000E-01 Na11
     1.666700000E-01    -1.666600000E-01    -1.666600000E-01 Na12

URL of this page: http://esca.atomki.hu
last modification:
Page maintained by Istvan Cserny   <cserny@atomki.hu>