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