wtorek, 17 lutego 2009

Durczok, Lis, Kaczyński, Niesiołowski i nasze emocje

Pan Kamil Durczok stał się dla nas źródłem wesołości, pozwalając się sfilmować przy pracy. Nie przebił moim zdaniem Tomasza Lisa, który uraczył nas jakiś czas temu jeszcze dłuższym potokiem błota wylewanego na współpracowników. Nie dziwi mnie to ani nie gorszy, wolę co prawda ludzi kulturalnych, ale pogodziłem się z tym, że takich jest mało na świeczniku. Ale przecież pan Kamil uważa się za kogoś wyrastającego ponad poziom przeciętny, nie chciał stawać w szranki o nagrodę medialną razem z Kasią Cichopek - kimże ona jest przy nim ! Bez urazy ...

Wczoraj mogliśmy obejrzeć Tomasza Lisa w rozmowie na temat pana Czumy, a potem na innym kanale telewizyjnym pana Pospieszalskiego w dyskusji o eutanazji. I tu i tam widziałem gotujące się emocje (pogardę i wściekłość u Niesiołowskiego, gniew u Kaczyńskiego, pogardę i wściekłość u pana profesora bioetyka, którego nazwiska nie zapamiętałem - przepraszam). W ogóle wszędzie pełno obrażania, dokuczliwych złośliwości i jadu. Lis stale wyciąga jakieś stare nagrania z Kaczyńskim, aby ludziom pokazać, jak agresywne są Kaczory. Nie udała mu się jednak prowokacja, kiedy gościł Kaczyńskiego u siebie - chociaż zaprezentował mu filmik z Marcinkiewiczem, nie usłyszał nic poza zapewnieniami o dobrej woli. Prezes Kaczyński zmienił front i hamuje agresję, choć pewnie mu ciężko. Za to tydzień później, Lis razem z nowym gościem wspólnie szydzili z nieobecnego prezesa bez umiaru. Uśmiechali się pogardliwie pod nosem wymieniając porozumiewawcze spojrzenia wspominając jego wpadki i litując nad jego poziomem.

U Pospieszalskiego goście byli spokojni i opanowani, oprócz pana Profesora, którego nazwiska nie pamiętam - wojującego ateisty, który bardzo się sam zdenerwował z tego powodu, że połowa ludzkości wierzy w duszę. Odniosłem wrażenie, że złościł się po prostu dlatego, że nie okazano mu należnego respektu - pani redaktor, z którą rozmawiał, ośmieliła się go krytykować. Upomniał ją, że winna mu szacunek, jako, że jest PROFESOREM. Pani redaktor też była mocno zdenerwowana.

Wszystko to nastraja mnie dość smutno - światem nie rządzi wcale rozum, wbrew temu, co się nam wmawia. Rządzą nimi EMOCJE wywoływane przez media - czytaj - MANIPULACJA. Na szczęście chyba nie zawsze skuteczna - drugie na szczęście - zdecentralizowana ... Kto wywoła odpowiednie emocje w odpowiednim kontekscie, przeciąga wyborcę (czytelnika? konsumenta?) na swoją stronę. Ludzie tacy jak Lis próbują to robić zawodowo, politycy - też, ale mam nadzieję, że przynajmniej ci, którym wierzę, robią to dla słusznych celów.

poniedziałek, 16 lutego 2009

Skrzynka z narzędziami

Podczas pracy z plikami tekstowymi często powstaje potrzeba przeprowadzenia prostej operacji w rodzaju sortowania, zmiany kolejności, sumowania itp. Zwykle odruchem jest pisanie jednolinijkowca w AWK-u albo innym ulubionym języku. Niesłusznie. Czasem lepiej jest otworzyć skrzynkę z narzędziami i poszukać gotowca. W Unix-ie mamy mnóstwo małych gotowych programów. Zdarzyło mi się napisać program, który robił to, co shuf i inny, który wykonywał operację paste. Niepotrzebnie. Poniżej wymieniam kilka z tych narzędzi.

csplit:podział pliku na podstawie zawartości
cut:wybranie kolumn
join:połączenie plików wg wspólnej kolumny
paste:sklejenie plików kolumnami
shuf:mieszanie kolejności linii w pliku
split:podział pliku na równe kawałki
tac:wypisanie pliku liniami od tyłu
tr:zamiana znaków
uniq:wybranie linii powtarzających się

Warto zapoznać się z nimi - mają bogaty repertuar różnych opcji - na przykład program split może zliczać linie, albo znaki. Program paste może skleić pliki pionowo lub poziomo. Program shuf może mieszać linie, ale może też potasować swoje argumenty. I tak dalej. Skrzynka narzędziowa jest pełna !

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.