Jak podzielić plik ciągów za pomocą AWK

Jak podzielić plik ciągów za pomocą AWK
Komenda Linux AWK (skrócona z nazw programistów; Aho, Weinberger i Kerghan) to świetny sposób na przetwarzanie i analizę pliku ciągów. Aby pliki były bardziej pouczające, muszą być zorganizowane w postaci wierszy i kolumn. Następnie możesz użyć AWK na tych plikach, aby:
  • Zeskanuj pliki, wiersz po linii.
  • Podziel każdą linię na pola/kolumny.
  • Określ wzorce i porównaj linie pliku z tymi wzorami
  • Wykonuj różne działania na liniach, które pasują do danego wzoru

W tym artykule wyjaśnimy podstawowe użycie polecenia AWK i sposób, w jaki można je użyć do podziału pliku ciągów. Przeprowadziliśmy przykłady z tego artykułu na temat systemu debian 10 Buster, ale można je łatwo odtworzyć na większości dystrybucji Linux.

Przykładowy plik, którego będziemy używać

Przykładowy plik ciągów, których będziemy używać, aby zademonstrować użycie polecenia AWK, jest następujący:

To właśnie wskazuje każda kolumna przykładowego pliku:

  • Pierwsza kolumna zawiera nazwę pracowników/nauczycieli w szkole
  • Druga kolumna zawiera temat, którego uczy pracownik
  • Trzecia kolumna wskazuje, czy pracownik jest profesorem lub adiunktem
  • Czwarta kolumna zawiera wynagrodzenie pracownika

Przykład 1: Użyj AWK, aby wydrukować wszystkie wiersze pliku

Drukowanie każdego wiersza określonego pliku jest domyślnym zachowaniem polecenia AWK. W poniższej składni polecenia AWK nie określamy żadnego wzoru, który AWK powinien wydrukować, dlatego polecenie ma zastosować akcję „Wydrukuj” do wszystkich wierszy pliku.

Składnia:

$ awk 'print ”nazwa pliku.tekst

Przykład:

W tym przykładzie mówię komendzie AWK, aby wydrukować zawartość mojego przykładowego pliku, wiersz po wierszu.

$ awk 'print' próbka.tekst

Przykład 2: Użyj AWK, aby wydrukować tylko linie pasujące do danego wzoru

Dzięki AWK możesz określić wzór, a polecenie wydrukuje tylko wiersze pasujące do tego wzoru.

Składnia:

$ awk '/ wzór_to_be_matched/ print' nazwa pliku.tekst

Przykład:

Z przykładowego pliku, jeśli chcę wydrukować tylko wiersze zawierające zmienną „B”, mogę użyć następującego polecenia:

$ awk '/ b/ print' próbka.tekst

Aby uczynić przykład bardziej znaczącym, pozwól mi wydrukować tylko informacje o pracownikach, którzy są profesorem.

$ awk '/ profesor/ print' próbka.tekst

Polecenie wydrukuje tylko wiersze/wpisy zawierające ciąg „Profesor”, dlatego mamy bardziej cenne informacje pochodzące z danych.

Przykład 3. Użyj AWK, aby podzielić plik, aby wydrukowano tylko określone pola/kolumny

Zamiast drukować cały plik, możesz zrobić AWK do drukowania tylko określonych kolumn pliku. AWK traktuje wszystkie słowa, oddzielone białą przestrzenią, domyślnie w wierszu jako rekord kolumny. Przechowuje rekord w zmiennej $ n. Gdzie 1 $ reprezentuje pierwsze słowo, 2 $ przechowuje drugie słowo, 3 $ czwarte i tak dalej. 0 USD przechowuje całą linię, aby drukowana jest linia WHO, jak wyjaśniono w przykładzie 1.

Składnia:

$ awk 'print $ n,… .' Nazwa pliku.tekst

Przykład:

Następujące polecenie wydrukuje tylko pierwszą kolumnę (nazwę) i drugą kolumnę (przedmiot) mojego przykładowego pliku:

$ awk 'drukuj 1 $, 2 $.tekst

Przykład 4: Użyj AWK, aby zliczyć i wydrukować liczbę linii, w których dopasowany jest wzór

Możesz powiedzieć AWK, aby policzyli liczbę linii, w których określony wzór jest dopasowany, a następnie wyprowadzić, że „liczba”.

Składnia:

$ awk '/wzór_to_be_matched/++ cnt end print "count =", cnt'
Nazwa pliku.tekst

Przykład:

W tym przykładzie chcę policzyć liczbę osób uczących temat „angielskiego”. Dlatego powiem poleceniu AWK do dopasowania wzoru „angielskiego” i wydrukowania liczby linii, w których ten wzór jest dopasowany.

$ awk '/angielski/++ cnt end print "count =", cnt' próbka.tekst

Liczba tutaj sugeruje, że 2 osoby uczą angielskiego z przykładowych rekordów plików.

Przykład 5: Użyj AWK do drukowania tylko linii z więcej niż określoną liczbą znaków

Do tego zadania będziemy używać wbudowanej funkcji AWK o nazwie „długość”. Ta funkcja zwraca długość ciągu wejściowego. Tak więc, jeśli chcemy, aby AWK drukował tylko linie z więcej niż liczbą niż liczbę znaków, możemy użyć funkcji długości w następujący sposób:

Do drukowania linii z znakami większą niż liczba:

$ awk 'długość (0 $)> n' nazwa pliku.tekst

Do drukowania linii z znakami mniejszą niż liczba:

$ AWK 'Długość (0 USD) < n' filename.txt

Gdzie n jest liczbą znaków, które chcesz określić dla linii.

Przykład:

Poniższe polecenie wydrukuje tylko wiersze z mojego przykładowego pliku, które mają znaki więcej niż 30:

$ awk 'długość (0 $)> 30' próbka.tekst

Przykład 6: Użyj AWK, aby zapisać wyjście polecenia w innym pliku

Korzystając z operatora przekierowania „>”, możesz użyć polecenia AWK, aby wydrukować jego dane wyjściowe na innym pliku. W ten sposób możesz go użyć:

$ awk 'criteria_to_print „nazwa pliku.TXT> PLIFILE.tekst

Przykład:

W tym przykładzie będę używać operatora przekierowania z moim poleceniem AWK, aby drukować tylko nazwiska pracowników (kolumna 1) do nowego pliku:

$ AWK 'drukuj 1 $' PLACK_FILE.TXT> Employe_names.tekst

Weryfikowałem za pośrednictwem poleceń CAT, że nowy plik zawiera tylko nazwy pracowników.

Przykład 7: Użyj AWK do drukowania tylko nie pustych linii z pliku

AWK ma kilka wbudowanych poleceń, których można użyć do filtrowania wyjścia. Na przykład polecenie NF służy do utrzymania liczby pól w bieżącym rekordie wejściowym. Tutaj użyjemy polecenia NF, aby wydrukować tylko nieokreślone wiersze pliku:

$ awk 'nf> 0' próbka.tekst

Oczywiście możesz użyć następującego polecenia, aby wydrukować puste wiersze:

$ awk 'nf < 0' sample_file.txt

Przykład 8: Użyj AWK, aby zliczyć całkowitą linie w pliku

Kolejna wbudowana funkcja o nazwie NR utrzymuje liczbę rekordów wejściowych (zwykle linii) danego pliku. Możesz użyć tej funkcji w AWK jako obserwującym, aby zliczyć liczbę linii w pliku:

$ awk 'end print nr' próbka.tekst

To była podstawowa informacja, którą musisz zacząć od podziału plików z poleceniem AWK. Możesz użyć kombinacji tych przykładów, aby pobrać bardziej znaczące informacje z pliku stringów za pośrednictwem AWK.