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 ( {} ).



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow