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.
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
'{ ... }' - 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
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
Prześlij komentarz