poniedziałek, 16 lutego 2009

Jednolinijkowce w AWK-u

AWK jest językiem programowania nadającym się wybitnie do tworzenia jednolinijkowców. "Jednolinijkowiec" to skrypt napisany ad-hoc, bez edytora, od razu w linii komend. Często mieści się w jednej linii - stąd nazwa.

Pracując nad analizą techniczną kursów walut używam często awk-a i bash-a jako narzędzi szybkiego prototypowania i błyskawicznych kalkulacji.

Przykład: w pliku A.txt mam dane w postaci tekstowej, każda linijka zawiera jedną liczbę - wartość kursu w danym punkcie. Chcę obliczyć średnią wykładniczą z dziesięciu okresów.

Za pomocą jednolinijkowca w AWK-u robię to tak:

awk '{s=0.1*$1+0.9*s; print s}' A.txt

Po przeczytaniu tego artykułu też będziesz to umieć.

Przykład innego typu: Chcę z pliku B.txt wybrać co dziesiątą linię:

awk '{n++; if(n>=10) {print; n=0}}' B.txt

Przykład trzeci - powiedzmy, że w pliku C.txt mam dwie kolumny z wartościami liczbowymi. Chcę obliczyć średnią wartość liczb w obu kolumnach. Posługuję się więc jednolinijkowcem, który tworzę w locie:

awk '{p+=$1; x+=$2; n++} END {print p/n, x/n}' C.txt

I tak dalej, wszysto szybko, łatwo i bezbłędnie.

AWK jest genialnie dostosowany do takich celów - ma kilka konstrukcji składniowych, kilka funkcji i kilka reguł, które trzeba poznać, podręcznik mieści się w jednym manualu systemowym, a możliwości są ogromne. Nie ma obiektów, klas, wyjątków ani modułów, ale robi to, co potrzebne. Aby sobie to uzmysłowić, wystarczy zrozumieć, jak działa AWK.

DZIAŁANIE AWK-a

Program w AWK-u to lista reguł. Każda reguła to wzorzec i akcja. Program czyta dane rekord po rekordzie, znajduje pierwszy wzorzec, który może być dopasowany do rekordu i wykonuje skojarzoną z nim akcję. Rekord dzieli się na pola, oznaczane w akcjach i wzorcach symbolami $1, $2, $3 itd.

Przykład:

awk '$1>1 {n++} END {print n}'

awk - to komenda - nazwa programu awk '$1>1 {n++} END {print n}' - to program w AWK-u, składa się z dwóch reguł: $1>1 {n++} - wzorzec $1>1 oznacza rekordy, w których wartość numeryczna pierwszego pola jest większa niż 1, akcja {n++} oznacza inkrementację zmiennej n END {print n} - wzorzec END to sztuczny wzorzec, nie dopasowywany do żadnego rekordu, skojarzona z nim akcja wykonywana jest na zakończenie programu. W tym wypadku wypisuje liczbę n.

Powyższy program liczy linie, w których pierwsza kolumna zawiera liczbę większą od 1, a następnie wypisuje wynik.

Akcje ujęte są w nawiasy {}, warunki to wyrażenia relacyjne lub specjalne symbole BEGIN lub END.

Inny przykład - pomnożenie wszystkich liczb zawartych w pliku:

awk 'BEGIN {x=1} {x*=$1} END {print x}'

Aby zmusić program do zainicjowania zmiennej jedynką został tu użyty wzorzec BEGIN. Tyle informacji wystarczy, aby rozpocząć eksperymentowanie.

Brak komentarzy: