$ awk f plik_z_programem plik_wejsciowy1 plik_wejsciowy2...

Podobne dokumenty
System operacyjny Linux

J ezyk AWK Kurs systemu UNIX

Wyrażenia regularne. Wyrażenia regularne 1/41

1 Podstawy c++ w pigułce.

Wstęp do systemów wielozadaniowych laboratorium 19 awk

Systemy operacyjne. Laboratorium 5. Awk podstawy. Jarosław Rudy Politechnika Wrocławska 28 lutego 2017

Programowanie w języku Python. Grażyna Koba

1 Przygotował: mgr inż. Maciej Lasota

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

skrypt powłoki to plik tekstowy, rozpoczynający się sekwencją: pierwsza linia określa powłokę, w której wykonywany jest skrypt; druga to komentarz

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Wstęp do informatyki 2011/2012. Wyrażenia regularne (sed)

JĘZYK SHELL JEST PEŁNYM JĘZYKIEM PROGRAMOWANIA

Skanowanie OCR w aplikacji Kancelaria Komornika. Instrukcja dla użytkownika

Programowanie komputerowe. Zajęcia 1

Przedstawię teraz tzw. podstawowe symbole wyrażenia regularne (BRE, Basic Regular Expression)

Podstawy Programowania Podstawowa składnia języka C++

1 Podstawy c++ w pigułce.

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

Skrypty powłoki Skrypty Najcz ciej u ywane polecenia w skryptach:

Python wprowadzenie. Warszawa, 24 marca PROGRAMOWANIE I SZKOLENIA

Dynamiczne przetwarzanie stron. dr Beata Kuźmińska-Sołśnia

Administracja sieciowymi systemami operacyjnymi III Klasa - Linux

lekcja 8a Gry komputerowe MasterMind

Podstawy Programowania C++

Bash - wprowadzenie. Bash - wprowadzenie 1/39

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Zastosowanie filtrów w Linuksie

Nazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else.

J.NAWROCKI, M. ANTCZAK, W. FROHMBERG, K. KOLANOWSKI, J. POCHMARA, S. WĄSIK, T. ŻOK AWK - WPROWADZENIE

LibreOffice Calc VBA

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Wstęp do Programowania, laboratorium 02

Przetwarzanie tekstu 2. Operacje na plikach tekstowych w systemie Linux

Warsztaty dla nauczycieli

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Powłoka I. Popularne implementacje. W stylu sh (powłoki zdefiniowanej w POSIX) W stylu csh. bash (najpopularniejsza) zsh ksh mksh.

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2015

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Jerzy Nawrocki, Wprowadzenie do informatyki

Języki programowania zasady ich tworzenia

Informatyka- wykład. Podstawy programowania w Pythonie. dr Marcin Ziółkowski

Ćwiczenie: JavaScript Cookies (3x45 minut)

1. Znajdź za pomocą programu locate wszystkie pliki które zawierają w nazwie słowo netscape locate netscape

Metody numeryczne Laboratorium 2

Systemy operacyjne. Laboratorium 9. Perl wyrażenia regularne. Jarosław Rudy Politechnika Wrocławska 28 lutego 2017

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Systemy operacyjne 12

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Lekcja 1. Składnia języka zmienne i podstawowe instrukcje PHP. Do wyświetlania tekstu służy instrukcja echo echo Hello world ;

Powłoka bash. Kurs systemu Unix 1

System operacyjny Linux

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

SAS Podstawowe informacje przed ćwiczeniem 1

Część 4 życie programu

Bloki anonimowe w PL/SQL

Naukę zaczynamy od poznania interpretera. Interpreter uruchamiamy z konsoli poleceniem

Języki formalne i techniki translacji

Podstawy JavaScript ćwiczenia

Przekierowanie wejścia wyjścia:

Języki formalne i automaty Ćwiczenia 6

Programowanie strukturalne i obiektowe

Laboratorium 3: Tablice, tablice znaków i funkcje operujące na ciągach znaków. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Języki programowania obiektowego Nieobiektowe elementy języka C++

Wykład II PASCAL - podstawy składni i zmienne, - instrukcje wyboru, - iteracja, - liczby losowe

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Wykład II PASCAL - podstawy składni i zmienne, - instrukcje wyboru, - iteracja cz. 1

Słowem wstępu. Część rodziny języków XSL. Standard: W3C XSLT razem XPath 1.0 XSLT Trwają prace nad XSLT 3.0

Technologie Informacyjne - Linux 3

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

Komentarze w PHP (niewykonywane fragmenty tekstowe, będące informacją dla programisty)

*W uproszczeniu: jest dziewięciu sędziów przyznających po dwie noty: za wartość techniczną i artystyczną (skala od 0.0 do 6.0)

Autor: dr inż. Katarzyna Rudnik

1 Wielokrotne powtarzanie tych samych operacji

Systemy operacyjne. Laboratorium 6. Awk wyrażenia regularne. Jarosław Rudy Politechnika Wrocławska 28 lutego 2017

Wprowadzania liczb. Aby uniknąć wprowadzania ułamka jako daty, należy poprzedzać ułamki cyfrą 0 (zero); np.: wpisać 0 1/2

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Inicjacja tablicy jednowymiarowej

Powtórka algorytmów. Wprowadzenie do języka Java.

1. Indeksy/indeksowanie : Do elementów wektora, list, macierzy czy ramek, można się odwołać na kilka sposobów.

INFORMATYKA Studia Niestacjonarne Elektrotechnika

Skrypty powłoki w systemie Linux

Podstawy programowania funkcjonalnego

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

Środowisko programisty Zestaw 7

SED - Stream EDitor. edytor strumieniowy. Bogumił Konopka W-11/I-21 Politechnika Wrocławska

Być może jesteś doświadczonym programistą, biegle programujesz w Javie,

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

Języki i metodyka programowania. Wprowadzenie do języka C

Wprowadzenie do języka Java

3. Opracować program kodowania/dekodowania pliku tekstowego. Algorytm kodowania:

Programowanie 2 - Tablice i łańcuchy

Struktura pliku wejściowego ipko biznes przelewy zagraniczne (MT103 / CSV)

#include <stdio.h> void main(void) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Serwer WWW Apache. Plik konfiguracyjny httpd.conf Definiujemy m.in.: Aktualne wersje 2.4.6, , zakończony projekt

Transkrypt:

Język przetwarzania tekstów AWK AWK jest językiem interpretowanym (niekompilowanym) i pozwala na prostą manipulację strukturami danych takimi jak dane tekstowe. Jest używany do takich zadań jak: tworzenia raportów, dodawania dodatkowych funkcji do edytorów tekstu takich jak vi, konwersji z jednego formatu pliku na inny, tworzenia małych baz danych, prowadzenia obliczeń matematycznych z użyciem plików tekstowych. Zasada działania języka opiera się na zasadzie: wczytywany jest pojedynczy rekord, i dla niego wykonywane są wszystkie instrukcje programu. Potem czytany jest następny, i znowu wykonywane są dla niego przeznaczone instrukcje. Programy pisane w awk różnią się od programów napisanych w większości innych języków, gdyż są sterowane danymi (datadriven): to znaczy, opisujemy dane, z którymi chcemy pracować, a następnie co zrobić po ich znalezieniu. Inne języki przeważnie są proceduralne; musimy opisać, bardzo szczegółowo, każdy krok jaki ma być wykonany przez program. Pracując w językach proceduralnych zwykle dużo trudniej jest precyzyjnie opisać dane, jakie będzie przetwarzał program. Z tego powodu, programy awk są często łatwe zarówno w pisaniu jak i czytaniu. Składnia wywołania programu jest przedstawiona poniżej: $ awk 'program' plik_wejsciowy1 plik_wejsciowy2... gdzie sekcja program zawiera reguły, natomiast pliki wejściowe są plikami z danymi. Przykładem wykonania takiego polecenia jest np. $ awk 'length($0) > 80' data Jeżeli chcemy wykonywać większe programy z większą ilością reguł (zapisanych w oddzielnym pliku) możemy użyć następującej składni polecenia: $ awk f plik_z_programem plik_wejsciowy1 plik_wejsciowy2... Można tworzyć wykonywalne programy z użyciem awk-a wstawiając do wykonywalnego pliku odpowiednią dyrektywę, a następnie pisząc instrukcje awk-a: #! /bin/awk f BEGIN { print "AWK Tekst" } Możemy tworzyć komentarze wstawiając znak # w danej linii przed tekstem komentarza. Instytut Informatyki AP 2010 (modified: 2010-03-13 12:30) strona 1

Działanie programu awk przedstawimy na poniższym przykładzie: Stwórzmy plik z danymi o poniższej strukturze i zapiszmy jako BBS_List: aardvark 555-5553 1200/300 B alpo-net 555-3412 2400/1200/300 A barfly 555-7685 1200/300 A bites 555-1675 2400/1200/300 A camelot 555-0542 300 C core 555-2912 1200/300 C fooey 555-1234 2400/1200/300 B foot 555-6699 1200/300 B macfoo 555-6480 1200/300 A sdace 555-3430 2400/1200/300 A sabafoo 555-2127 1200/300 C Napiszmy prosty program: $ awk '/foo/ { print $0 }' BBS-list (wyświetl linie zawierające ciąg znakowy foo) Teraz nieco trudniejszy program z dwiema regułami: $ awk '/12/ { print $0 } \ > /21/ { print $0 }' BBS-list (wyświetl linie zawierające ciągi znakowe 12 i 21) Dodatkowo istnieją dwa warunki specjalne: BEGIN i END. Pierwszy jest prawdziwy na samym początku, zanim jeszcze zostanie wczytany pierwszy rekord z jakiegokolwiek pliku. Drugi jest prawdziwy po zakończeniu czytania wszystkich plików. Można pominąć w wyrażeniu albo warunek (wtedy blok będzie wykonywany dla każdego rekordu}, albo część z poleceniami (łącznie ze znakami { i }) - wtedy domyślnym blokiem instrukcji jest wypisanie rekordu na standardowe wyjście. Wywołanie programu awk z użyciem potoków: $ ls -lg awk '$5 == "lis" { sum += $4 } END { print sum }' Polecenie to spowodowało wyświetlenie łącznej objętości plików utworzonych w listopadzie. Można używać instrukcji warunkowych (wcześniej musimy utworzyć plik data): $ awk '{ if (length($0) > max) max = length($0) } \ > END { print max }' data (wyświetla długość najdłuższej linii z pliku data) Instytut Informatyki AP 2010 (modified: 2010-03-13 12:30) strona 2

Jak również pętli: $ awk 'BEGIN { for (i = 1; i <= 7; i++) \ print int(101 * rand()) }' (wyświetla siedem losowych liczb z zakresu od 0 do 100) Można rozszerzać polecenia używając programu awk: $ awk -F: '{ print $1 }' /etc/passwd sort (wyświetla posortowaną listę loginów użytkowników) Można wyświetlić wybrane linie tekstu: $ awk 'NR % 2 == 0' data (wyświetla parzyste linie tekstu) Inne przykłady użycia awk: $ awk '{ $3 = $2-10; print $2, $3 }' (użycie wyrażeń matematycznych) W awk nie ma deklaracji zmiennych. Wszystkie zmienne są inicjalizowane w momencie użycia, a przy inicjalizacji otrzymują wartość 0 lub "" (pusty napis), w zależności od kontekstu w jakim zmienna została użyta. Wszystkie tablice zmiennych w awk są asocjacyjne, tzn. są indeksowane nie liczbami, a napisami. Można się też odwoływać do tablic przez indeksy: wtedy liczba jest zamieniana na napis, i dalej następuje odwołanie do elementu indeksowanego napisem. Operatory są podobne do tych z języka C i tak np. przypisanie to będzie znak =, a porównanie ==. Przykład: $ awk 'BEGIN { for (i = 1; i <= 10; i++) \ > { tab[i]=i; \ > if(i%2) \ > print tab[i]; }}' (wyświetli wszystkie nieparzyste liczby z zakresu od 0 do 10) Awk udostępnia liczne zmienne specjalne, które są ustawiane przez sam interpreter, lub mają bezpośredni wpływ na działanie programu. Podstawowe takie zmienne to zmienne (używane w poprzednich przykładach) poprzedzone znakiem dolara: $0, $1, $2,... Po wczytaniu dowolnego rekordu jest on zapamiętywany w zmiennej $0. Dodatkowo jest dzielony na pola, oddzielone od siebie separatorami. Przykładowo jeśli mamy linię z napisem "aaa bbb ccc", a separatorem jest spacja, to pola mają kolejno wartości: "aaa", "bbb", "ccc". I takie wartości też są przypisywane kolejno zmiennym: $1, $2, $3. Innym rodzajem zmiennych są zmienne takie jak: NF (liczba wczytanych pól), FS (separator pól - tu wpisywane jest pełne wyrażenie regularne, które opisuje separatory (np. "a b"). $ awk 'NF > 0' data (wyświetli wszystkie linie z wyjątkiem tych, które są puste) Instytut Informatyki AP 2010 (modified: 2010-03-13 12:30) strona 3

Wyjątkiem jest separator " " (spacja), który pasuje do dowolnej liczby spacji, tabulatorów, itp. Początkowe i końcowe separatory (np. jak w " abc abc ") są ignorowane. Jeśli FS jest puste, to rekordy są dzielone na pojedyncze znaki. Oprócz separatora pól mamy też separator rekordów, trzymany w zmiennej RS. Domyślnie separatorem jest znak nowej linii (\n) Przy wypisywaniu rekordów na wyjście możemy posługiwać się innymi separatorami niż te, które były używane przy wejściu: analogicznie do FS i RS dostępne są też OFS i ORS (output field/record separator) Kolejne to: NR (numer wczytanego rekordu) i FNR (numer wczytanego rekordu z aktualnego pliku). Nazwa aktualnie przetwarzanego pliku jest trzymana w zmiennej FILENAME. Następne zmienne: ARGC i ARGV, pierwsza z nich to ilość parametrów podanych do programu, druga to tablica tych parametrów, indeksowana od 0. ARGV[0] to nazwa uruchomionego interpretera (na ogół "awk"), pozostałe to rzeczywiste parametry, odpowiadające nazwom plików z których AWK bierze kolejne rekordy. Inne zmienne: zmienna ENVIRON. To jest tablica, która trzyma wszystkie zmienne środowiskowe. $ echo a b c d awk '{ OFS = ":"; $2 = "" > print $0; print NF }' (powoduje usunięcie drugiego pola i nadanie znaków separacji :, a następnie wyświetlenie całego rekordu i liczby wczytanych rekordów) $ echo a b c d awk '{ OFS = ":"; $2 = ""; $6 = "new" > print $0; print NF }' $ awk BEGIN {print ENVIRON[ HOME ]} (wypisuje zawartość zmiennej środowiskowej $HOME) Instytut Informatyki AP 2010 (modified: 2010-03-13 12:30) strona 4

Użycie wyrażeń regularnych Wyrażenia regularne mogą być używane jako wzorce zamknięte w znaki ukośnika /. Można ich używać również w instrukcjach warunkowych oraz pętlach. Wyrażenie ~ /wyrreg/ - jest prawdziwe, gdy ciąg znakowy pasuje do ciągu z pomiędzy znaków ukośnika np. $ awk {if ($0 ~ /peter/ $0 ~ /paul/) \ > print "znaleziono"; \ > else "nie znaleziono";} imiona Wyrażenie!~ /wyrreg/ - jest prawdziwe, gdy ciąg znakowy nie pasuje do ciągu z pomiędzy znaków ukośnika Znaki kontrolne rozpoczynające się od znaku \. Poniżej przykłady takich znaków. \xnn znak o kodzie ASCII nn \x{nnnn} znak o kodzie nnnn (jeden bajt dla tekstu ASCII, dwa bajty dla znaków Unicode) \t znak TAB (HT/TAB), to samo co \x09 \n nowa linia (NL), to samo co \x0a \r powrót karetki (CR), to samo co \x0d \f form feed (FF), to samo co \x0c \a alarm (BEL), to samo co \x07 \e escape (ESC), to samo co \x1b Przykład: $ awk 'BEGIN { print "He said \"hi!\" to her." }' Operatory wyrażeń regularnych (metaznaki). Metaznak ^ - dopasowuje początek ciągu znakowego np. if ("line1\nline 2" ~ /^L/) Metaznak $ - dopasowuje koniec ciągu znakowego np. if ("line1\nline 2" ~ /1$/) Metaznak. dopasowuje pojedynczy znak Instytut Informatyki AP 2010 (modified: 2010-03-13 12:30) strona 5

Listy znakowe ujęte w nawiasy kwadratowe [] dopasowują do któregokolwiek znaku z listy np. [MXK] dopasuje jeden ze znaków umieszczonych w nawiasach, [1-9] dopasuje cyfry od 1 do 9 [^0-9] dopasuje dowolny znak z wyjątkiem cyfr Metaznak - jest operatorem alternatywy np. ^P [0-9] Metaznak iterator * dopasowuje dowolny ciąg znakowy składający się z 0 lub większej ilości znaków $ awk '/\(c[ad][ad]*r x\)/ { print }' sample dopasuje i wyświetli linie pasujące do wzorców jak (car x), (cdr x), itp.) Pozostałe metaznaki iteratory: * zero lub więcej, podobne do {0,} (greedy) + jeden lub więcej, podobne do {1,} (greedy)? zero lub jeden, podobne do {0,1} (greedy) {n} dokładnie n razy (greedy) {n,} co najmniej n razy (greedy) {n,m} przynajmniej n razy, ale nie więcej niż m razy (greedy) *? zero lub więcej, podobne do {0,}? (nie greedy) +? jeden lub więcej, podobne do {1,}? (nie greedy)?? zero lub jeden, podobne do {0,1}? (nie greedy) {n}? dokładnie n razy (nie greedy) {n,}? przynajmniej n razy (nie greedy) {n,m}? co najmniej n razy, ale nie więcej niż m razy (nie greedy) Przykłady: wh{3}y dopasuje `whhhy' ale nie `why' czy `whhhhy'. wh{3,5}y dopasuje `whhhy' lub `whhhhy' lub `whhhhhy' - tylko takie. wh{2,}y dopasuje `whhy' lub `whhhy', i tak dalej. Instytut Informatyki AP 2010 (modified: 2010-03-13 12:30) strona 6

Ćwiczenie Utworzyć plik coins.txt o następującej zawartości (tylko to co w ramce): metal weight in ounces date minted country of origin description gold 1 1986 USA American Eagle gold 1 1908 Austria-Hungary Franz Josef 100 Korona silver 10 1981 USA ingot gold 1 1984 Switzerland ingot gold 1 1979 RSA Krugerrand gold 0.5 1981 RSA Krugerrand gold 0.1 1986 PRC Panda silver 1 1986 USA Liberty dollar gold 0.25 1986 USA Liberty 5-dollar piece silver 0.5 1986 USA Liberty 50-cent piece silver 1 1987 USA Constitution dollar gold 0.25 1987 USA Constitution 5-dollar piece gold 1 1988 Canada Maple Leaf Wyświetlić wszystkie linie zawierające informacje o monetach wykonanych ze złota. Wyświetlić opis (description) monet wykonanych ze złota. Wyświetlić wszystkie monety wybite przed 1980 rokiem Policzyć ile monet znajduje się w kolekcji Policzyć jaką wartość mają złote monety, przyjmując że mają one wartość 425$ Napisać program obliczający wg poniższego wzoru: Podsumowanie mojej kolekcji: Zlotych monet: Waga zotych monet: Wartość złotych monet: Srebrnych monet: Waga srebrnych monet: Wartość srebrnych monet: Wszystkich monet: Wartość kolecji: nn nn.nn n,nnn.nn nn nn.nn n,nnn.nn nn n,nnn.nn Instytut Informatyki AP 2010 (modified: 2010-03-13 12:30) strona 7