Jak używać AWK do filtrowania tekstu lub ciągów za pomocą działań specyficznych dla wzoru
- 3471
- 615
- Seweryn Augustyniak
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.listaWydrukuj 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:
- pierwszy:
/ *\ $ [2-9] \.[0-9] [0-9] */
Otrzymuje linie, które mają cenę produktów spożywczych większą niż 2 USD I - 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.listaFiltruj 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.listaFiltruj 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.
- « Ebook wprowadzający Django Pierwsze start z Basics Python
- Jak zainstalować PHP 7 dla Apache lub Nginx na Ubuntu 14.04 i 14.10 »