Jak używać AWK do filtrowania tekstu lub ciągów za pomocą działań specyficznych dla wzoru

Jak używać AWK do filtrowania tekstu lub ciągów za pomocą działań specyficznych dla wzoru

W trzecie.

Czasami, podczas filtrowania tekstu, chcesz wskazać niektóre wiersze z pliku wejściowego lub linii ciągów na podstawie danego warunku lub przy użyciu określonego wzoru, który można dopasować. Robienie tego z Awk jest bardzo łatwe, jest to jedna z wspaniałych cech Awk że znajdziesz pomocne.

Spójrzmy na przykład poniżej, powiedzmy, że masz listę zakupów artykułów spożywczych, które chcesz kupić, zadzwonił Ceny żywności.lista. Ma następującą listę artykułów spożywczych i ich cen.

$ cat Food_prices.lista  Brak Item_name Cena 1 Mangoe 10 2 USD.45 2 jabłka 20 $ 1.50 3 Banany 5 $ 0.90 4 ananasy 10 3 USD.46 5 pomarańczy 10 $ 0.78 6 pomidorów 5 $ 0.55 7 cebuli 5 $ 0.45 

A potem chcesz wskazać (*) Zaloguj się na produkty żywnościowe, których cena jest większa niż 2 USD, Można to zrobić, uruchamiając następujące polecenie:

$ awk '/ *$ [2-9] \.[0-9] [0-9] */ drukuj 1 $, 2 $, 3 $, 4 $, „ *”;  / *$ [0-1] \.[0-9] [0-9] */ print; ' Ceny żywności.lista 
Wydrukuj przedmioty, których cena jest większa niż 2 USD

Ze powyższego wyjścia widać, że istnieje (*) Podpis na końcu linii posiadających artykuły spożywcze, Mango I ananasy. Jeśli sprawdzisz ich ceny, są powyżej 2 USD.

W tym przykładzie użyliśmy dwóch wzorów:

  1. pierwszy: / *\ $ [2-9] \.[0-9] [0-9] */ Otrzymuje linie, które mają cenę produktów spożywczych większą niż 2 USD I
  2. drugi: /*\ $ [0-1] \.[0-9] [0-9] */ szuka linii z ceną produktów żywnościowych mniej niż 2 USD.

Tak się dzieje, w pliku znajdują się cztery pola, gdy wzór napotyka linię z ceną produktów żywnościowych większą niż 2 USD, Wydrukuje wszystkie cztery pola i (*) podpisz na końcu linii jako flaga.

Drugi wzór po prostu drukuje inne linie z ceną żywności mniej niż 2 USD Jak pojawiają się w pliku wejściowym, Ceny żywności.lista.

W ten sposób możesz użyć działań specyficznych dla wzoru, aby odfiltrować produkty żywnościowe, które są wycenione powyżej 2 USD, Chociaż występuje problem z wyjściem, linie, które mają (*) Znak nie jest sformatowany jak reszta linii, co czyni wyjście nie wystarczająco jasne.

Widzieliśmy ten sam problem w części 2 serii AWK, ale możemy go rozwiązać na dwa sposoby:

1. Za pomocą printf polecenie, które jest długim i nudnym sposobem za pomocą poniższego polecenia:

$ awk '/ *$ [2-9] \.[0-9] [0-9] */ printf " %-10S %-10S %-10S %-10S \ n", 1 USD, 2 USD, 3 USD, 4 " *";  / *$ [0-1] \.[0-9] [0-9] */ printf " %-10S %-10S %-10S %-10S \ n", 1 USD, 2, 3 USD, 4 USD; ' Ceny żywności.lista 
Filtruj i drukowanie elementów za pomocą AWK i Printf

2. Za pomocą 0 USD pole. Awk używa zmiennej 0 Aby przechowywać całą linię wejściową. Jest to przydatne do rozwiązania powyższego problemu i jest prosty i szybki w następujący sposób:

$ awk '/ *$ [2-9] \.[0-9] [0-9] */ drukuj 0 $ " *";  / *$ [0-1] \.[0-9] [0-9] */ print; ' Ceny żywności.lista 
Filtruj i drukuj elementy za pomocą AWK i zmiennej

Wniosek

To wszystko na razie i są to proste sposoby filtrowania tekstu za pomocą działania specyficznego dla wzorca, które mogą pomóc w oznaczaniu linii tekstu lub ciągów w pliku za pomocą Awk Komenda.

Mam nadzieję, że ten artykuł jest pomocny i pamiętaj o przeczytaniu następnej części serii, która skupi się na korzystaniu z operatorów porównawczych za pomocą narzędzia AWK.