awk
Przydatne linijki - obliczanie średniej z CSV itp
Szukaj…
Solidne przetwarzanie danych tabelarycznych (CSV i in.)
Przetwarzanie danych tabelarycznych za pomocą awk jest bardzo łatwe, pod warunkiem, że dane wejściowe są poprawnie sformatowane. Większość oprogramowania wytwarzającego dane tabelaryczne wykorzystuje specyficzne cechy tej rodziny formatów, a programy awk przetwarzające dane tabelaryczne są często specyficzne dla danych wytwarzanych przez określone oprogramowanie. Jeśli wymagane jest bardziej ogólne lub solidne rozwiązanie, większość popularnych języków udostępnia biblioteki zawierające wiele funkcji znalezionych w danych tabelarycznych:
- opcjonalne nazwy kolumn w pierwszym wierszu
- mieszanka cytowanych i niecytowanych wartości kolumn
- różne ograniczniki
- zlokalizowane formaty liczb zmiennoprzecinkowych
Chociaż zdecydowanie możliwe jest czyste i ogólne obsługiwanie wszystkich tych funkcji za pomocą awk, prawdopodobnie nie jest to warte wysiłku.
Wymiana dwóch kolumn w danych tabelarycznych
Biorąc pod uwagę plik przy użyciu ; jako separator kolumny. Permutacja pierwszej i drugiej kolumny odbywa się za pomocą
awk -F';' -v 'OFS=;' '{ swap = $2; $2 = $1; $1 = swap; print }'
Oblicz średnią wartości w kolumnie na podstawie danych tabelarycznych
Biorąc pod uwagę plik przy użyciu ; jako separator kolumny. Obliczamy średnią wartości w drugiej kolumnie za pomocą następującego programu, podanym danymi wejściowymi jest lista ocen grupy studentów:
awk -F';' '{ sum += $2 } END { print(sum / NR) }' <<EOF
Alice;2
Victor;1
Barbara;1
Casper;4
Deborah;0
Ernest;1
Fabiola;4
Giuseppe;4
EOF
Dane wyjściowe tego programu to 2.125 .
Pamiętaj, że NR przechowuje numer przetwarzanej linii, w bloku END przechowuje zatem całkowitą liczbę linii w pliku.
Pamiętaj, że w wielu aplikacjach (monitorowanie, statystyki) mediana jest znacznie bardziej przydatną informacją. Zobacz odpowiedni przykład.
Wybieranie określonych kolumn w danych tabelarycznych
Zakładamy, że plik używa; jako separator kolumny. Wybór określonego zestawu kolumn wymaga tylko instrukcji wydruku . Na przykład następujący program wybiera kolumny 3, 4 i 7 ze swojego wejścia:
awk -F';' -v 'OFS=;' '{ print $3, $4, $7 }'
Jak zwykle można ostrożniej wybrać linie do wydrukowania. Poniższy program wybiera kolumny 3, 4 i 7 z danych wejściowych, gdy pierwszym polem jest Alice lub Bob :
awk -F';' -v 'OFS=;' '($1 == "Alice") || ($1 == "Bob") { print $3, $4, $7 }'
Oblicz medianę wartości w kolumnie na podstawie danych tabelarycznych
Biorąc pod uwagę plik przy użyciu ; jako separator kolumny. Medianę wartości obliczamy w drugiej kolumnie za pomocą następującego programu, napisanego dla GNU awk . Podane dane wejściowe to lista ocen grupy studentów:
gawk -F';' '{ sample[NR] = $2 }
END {
asort(sample);
if(NR % 2 == 1) {
print(sample[int(NR/2) + 1])
} else {
print(sample[NR/2])
}
}' <<EOF
Alice;2
Victor;1
Barbara;1
Casper;4
Deborah;0
Ernest;1
Fabiola;4
Giuseppe;4
EOF
Dane wyjściowe tego programu to 1 .
Pamiętaj, że NR przechowuje numer przetwarzanej linii, w bloku END przechowuje zatem całkowitą liczbę linii w pliku.
Wiele implementacji awk nie ma funkcji sortowania tablic, dlatego należy je zdefiniować, zanim będzie można użyć powyższego kodu.
Wybieranie zestawu linii między dwoma wzorami
Dopasowywanie wzorca może być efektywnie używane z awk ponieważ kontroluje on następujące po nim działania, tj. { pattern } { action } . Jednym fajnym zastosowaniem dopasowania wzorca jest wybranie wielokrotności między dwoma wzorami w pliku, powiedzmy patternA i patternB
$ awk '/patternA/,/patternB/' file
Załóżmy, że zawartość mojego pliku jest następująca i chcę wyodrębnić linie tylko między powyższym wzorem: -
$ cat file
This is line - 1
This is line - 2
patternA
This is line - 3
This is line - 4
This is line - 5
patternB
This is line - 6
$ awk '/patternA/,/patternB/' file
patternA
This is line - 3
This is line - 4
This is line - 5
patternB
Powyższe polecenie nie wykonuje żadnej konkretnej { action } poza drukowaniem pasujących linii, ale wszelkie określone akcje w podzbiorze linii można zastosować za pomocą bloku akcji ( {} ).