Progmar Marcin Załęczny

Język:

Gawk w przykładach

Plik persons.txt użyty w przykładowych poleceniach (imię, rok urodzenia, wzrost, waga):

Piotr   1989    184 70.2
Tomasz  1994    172 60.8
Paweł   2003    104 48.4
Marcin  1980    174 91.6
Michał  1990    168 74.9
Lucjan  2000    80  44.1
Paweł   2000    124 60.2
Rafał   1980    174 91.6
Michał  1998    139 89.1
Damian  1994    170 68.2

Wypisanie zawartości pliku persons.txt linia po linii: gawk '{ print }' persons.txt

Wypisanie zawartości pliku persons.txt linia po linii, rozdzielając poszczególne pola znakiem dwukropka. Poszczególne pola każdej linii (rozdzielone białym znakiem) są automatycznie przypisywane do zmiennych $1, $2, $3, ...: gawk '{ print $1 ":" $2 ":" $3 ":" $4 }' persons.txt

Wypisanie zawartości pliku persons.txt linia po linii, z wykorzystaniem funkcji printf formatującej łańcuchy znaków. Składnia łańcucha formatującego funkcji printf jest identyzna jak w języku c: gawk '{ printf "%s %d %d %.2f\n", $1, $2, $3, $4 }' persons.txt

Wypisanie zawartości pliku persons.txt linia po linii, poszczególne pola są formatowane jako łańcuchy odpowiednio o długości imię = 10 znaków, rok urodzenia = 5 znaków, wzrost = 5 znaków, waga = 5 znaków. Poszczególne pola są wyrównane do prawej strony każdej kolumny: gawk '{ printf "%10s %5s %5s %5s\n", $1, $2, $3, $4 }' persons.txt A poniżej to samo, tylko z wyrównaniem wszystkich kolumn do lewej: gawk '{ printf "%-10s %-5s %-5s %-5s\n", $1, $2, $3, $4 }' persons.txt

Wypisanie tylko tych linii, które pasują do podanego wyrażenia regularnego: gawk '/^P.*$/ { print }' persons.txt lub równoważnie (bo domyślną akcją jest print): gawk '/^P.*$/' persons.txt

Wyświetlenie imienia i roku urodzenia dla tych wierszy, których rok urodzenia zawiera cyfrę 8 (pasuje do podanego wzorca): gawk '$2 ~ /8/ {print $1, $2}' persons.txt

Wyświetlenie tylko tych linijek, w których rok urodzenia równa się liczbowo wartości 2003: gawk '$2 == 2003 {print}' persons.txt

Wyświetlenie tylko tych linijek, w których rok urodzenia jest większy niż 1990 i mniejszy niż 2015. Operatory logiczne stosuje się tu identycznie jak w c: gawk '$2 > 1990 && $2 < 2015 {print}' persons.txt

Wypisanie wszystkich wierszy, które występują od momentu znalezienia wiersza pasującego do pierwszego wzorca aż do wiersza (włącznie), który pasuje do drugiego wzorca (po przecinku): gawk '/Paweł/, /Michał/ {print}' persons.txt Jeśli pierwsze dopasowanie nie zostało znalezione, to nie zostaną wypisane żadne wiersze: gawk '/Paweł123/, /Michał/ {print}' persons.txt Jeśli pierwsze dopasowanie zostało znalezione a drugie nie, to zostaną wypisane wszystkie wiersze od pierwszego pasującego do ostatniego w pliku: gawk '/Paweł/, /Michał123/ {print}' persons.txt Jeśli nie osiągnięto końca pliku po znalezieniu i wypisaniu pasujących wierszy, to proces wyszukiwania rozpoczyna się od nowa począwszy od aktualnej pozycji w pliku.

Przykład wykonania programu zamieszczonego w pliku:
cat program:

BEGIN {
    print "============================"
    printf "%-10s %-5s %-6s %-6s\n", "Imię", "Rok", "Wzrost", "Waga"
    print "============================"
}
{ printf "%-10s %-5s %-6s %-6s\n", $1, $2, $3, $4 }
END {
    print "============================"
}
gawk -f program persons.txt

Instrukcje w bloku BEGIN są wykonane jeszcze przed wczytaniem i przetworzeniem danych z pliku wejściowego.
Instrukcje w bloku END są wykonane po przetworzeniu danych wejściowych.

Funkcja length bez parametru zwraca długość bieżącego wiersza, funkcja length z parametrem zwraca długość podanego parametru.
Zmienna $0 zwraca aktualnie przetwarzany wiersz.
Zmienna NR zawiera numer aktualnego wiersza. Zmienna NR występująca w bloku END zawiera numer ostatniego wiersza.
Zmienna NF zawiera liczbę pól w wierszu.

Wypisanie w nawiasach przed dwukropkiem długości aktualnego wiersza a po dwukropku zawartości tego wiersza: gawk '{ print "(" length "): " $0 }' persons.txt

Wypisanie w nawiasach przed dwukropkiem długości pierwszego pola a po dwukropku zawartości tego pola: gawk '{ print "(" length($1) "): " $1 }' persons.txt

Wypisanie przed dwukropkiem numeru aktualnego wiersza a po dwukropku zawartości tego wiersza: gawk '{ printf "%2s: %s\n", NR, $0 }' persons.txt

Wyświetlenie wierszy od 7 do 9: gawk 'NR == 7 , NR == 9' persons.txt

Zmiana wartości pól podczas przetwarzania wierszy - Imię "Marcin" w oryginalnym wierszu zamieniane jest na "Paweł" a imię "Paweł" w oryginalnym wierszu zamieniane jest na "Marcin". Jeśli zmiana miała miejsce, to w nowej zawartości linii wszystkie wielokrotne separatory zostaną zastąpione jedną spacją:
cat program:

{
    tmp = $1
    if (tmp ~ /^Marcin$/) $1 = "Paweł"
    if (tmp ~ /^Paweł$/) $1 = "Marcin"
    print
}
gawk -f program persons.txt

Możliwe jest też stworzenie samodzielnego skryptu, który będzie uruchamiany z linii poleceń:
cat program:

#!/usr/bin/gawk -f
{
    tmp = $1
    if (tmp ~ /^Marcin$/) $1 = "Paweł"
    if (tmp ~ /^Paweł$/) $1 = "Marcin"
    print
}
chmod 755 program
./program persons.txt

Aby zmienić znak separatora danych wyjściowych, należy ustawić go w zmiennej OFS. Będzie on zastosowany we wszystkich zmodyfikowanych liniach: BEGIN { OFS = ":" }

Aby zmienić znak separatora danych wejściowych, należy ustawić go w zmiennej FS, np.: BEGIN { FS = ":" }

Przekierowanie wyjścia do pliku: gawk '{ print > "plik.txt" }' persons.txt

Przykład zastosowania tablicy asocjacyjnej do wyświetlenia liczby występujących powtórzeń imion. Domyślnie każdy nowo użyty element jest inicjalizowany wartością 0: { imiona[$1]++ }
END { for (imie in imiona) print imie, imiona[imie] }

Podzielenie bieżącego wiersza na tablicę pól - znakiem dzielącym jest ':'. Jeśli w tym wierszu wystąpiły wielokrotnie pod rząd znaki podziału :, to poszczególne pola przyjmują wartość pustą: split($0, tablica_pol, ":")

Wczytanie kolejnego wiersza danych wejściowych: getline linia