A może język AWK?

AWK to język skryptowy, który często pozostaje w cieniu bardziej popularnych języków programowania. Jednak dla osób zajmujących się przetwarzaniem danych, zwłaszcza tekstowych, AWK może okazać się niezwykle przydatnym narzędziem.

Język AWK analizuje plik


AWK nie jest tak popularny jak języki ogólnego przeznaczenia takie jak Python, C++, C#, Java, JavaScript/TypeScript i tak dalej i dalej... jednak jego znajomość może okazać się przydatna kiedy zetkniemy się z bardzo dużym plikiem tekstowym i będziemy musieli z niego wydobyć odpowiednie dane. Oczywiście plik np. CSV możemy obrobić w Pythonie i to stosunkowo szybko i łatwo jednak załóżmy, że jeżeli mamy tylko coś sprawdzić a nie pracować na pliku tekstowym to jednak AWK zrobi to szybciej.

Potęga języka AWK kryje się w jego prostocie. Oczywiście ktoś, kto nigdy nie miał styczności z programowaniem tej "prostoty" może nie dostrzec i jest to ważne aby podkreślić ten fakt.


Przykład użycia języka AWK

Nie jest to wstęp do kursu ani nic takiego, chcę tylko zademonstrować podstawy języka AWK i jego zastosowanie. Pokazane tutaj przykłady można użyć w terminalu linuxa. 
Załóżmy, że mamy plik dane.txt wiemy, że to plik tekstowy. Dodatkowo zawiera on listę imion, nazwisk oraz wiek, po jednym w każdej linii.


Jeżeli chcemy wypisać wszystkie dane z 1 kolumny tj. imiona napiszemy w konsoli

awk '{print $1}' dane.txt

awk - użyj języka AWK

'{ ... }' - ciało kodu

print - wypisz

$1 - kolumna 

Załóżmy jednak, że chcemy coś bardziej rozbudowanego 


Wróćmy do naszego dane.txt 

Załóżmy, że wyglądają one tak

...
Jan,Kowalski,30
Anna,Nowak,25
...


Widzimy imię, nazwisko, wiek 

Teraz chcemy znowu odczytać imiona ale są separatory


awk 'BEGIN { FS = "," } { print $1 }' dane.txt


Teraz zaczynamy od konstrukcji BEGIN, później dodajemy FS = "," czyli określamy separator w tym wypadku to "," przecinek. Dalej ten sam kod co wcześniej.

Ale załóżmy, że w naszym pliku z imionami interesuje nas konkretne imię np. "Dawid" i chcemy się dowiedzieć ile osób o tym imieniu jest w naszym pliku. Powód tego obecnie nie jest ważny, ważne jest zliczenie. 

BEGIN {

FS = ","

COUNT = 0;

print "Zaczynamy liczenie"

}

$1 == "Dawid"

{print "Znalazłem Dawida: " $0

COUNT ++

}

END

{ print "Koniec liczenia"

print "Dawid został odnaleziony:  " COUNT " tyle razy"

}


Teraz jak widzisz kod jest o wiele większy. I znowu co tu widzimy?
FS czyli ustalamy separator,
COUNT tworzymy zmienną do przechowywania wartości liczbowej w tym wypadku nazwałem ją COUNT ale może mieć dowolną nazwę.  Służy do przechowania informacji ilu np. klientów ma na imię Dawid.
print "Zaczynamy liczenie" wyświetli nam w konsoli informację, że funkcja zaczyna działać. I to wszystko w 1 bloku zaczynającym funkcję.
Dalej mamy już warunek.

$1 == "Dawid" sprawdza czy pierwsze pole tj. pierwsze słowo w linii jest równe "Dawid" Jeżeli tak wywoła fragment poniżej. Wyświetli napis, że znalazł oraz co ważne $0 czyli wyświetli nam całą linię np. 

Dawid, Kowalski, 29

I zwiększy COUNT o 1  i to zostanie wykonane tyle razy ile Dawid zostanie odnaleziony czyli jak plik ma 100 linii przejdzie przez 100 linii i wykona się x razy Dawid zostanie znaleziony.

{print "Znalazłem Dawida: " $0

COUNT ++

}

Po wykonaniu się program powie, że skończył liczenie i poinformuje nas ile razy Dawid został znaleziony w pliku.

Moment możesz powiedzieć, że pisanie tego kodu za każdym razem jak chcemy poszukać Dawida w pliku jest stratą czasu i masz rację. Dlatego możemy zapisać sobie taki plik np, program-1.awk i kiedy będzie potrzeba aby odszukać imienia Dawid w pliku powiemy

awk -f program-1.awk dane.txt

czyli hej AWK odczytaj skrypt o nazwie program-1.awk i użyj go na dane.txt 

Również możemy ten program-1.awk otworzyć w edytorze zmienić imię na każde inne, które chcemy i tak zmienić aby kod był bardziej uniwersalny i za każdym razem zmieniać tylko wartość zmiennej dla imienia.


Kończymy o AWK

Jak widać język AWK może być przydatny zwłaszcza jak pracujemy w środowisku tekstowym. Pozwala on na szybkie sprawdzanie plików i znajdowanie nas interesujących danych np. logów systemowych. Może jeszcze być przydatne dla kogoś kto widzi $0, $1 etc. krótka notatka jeszcze o odwoływaniu się do kolumn: 

$0 - oznacza cały rekord czyli wyświetli całą linijkę i wartość z każdej kolumny

$1 - oznacza 1 kolumnę w pliku i tak $2 to druga kolumna i tak dalej jak plik ma 5 kolumn a nas interesuje np. 4 kolumna to piszemy $4

Komentarze