Jak korzystać z AWK

20 Feb 11:57 am


Original: http://sparky.rice.edu/awk.html

Awk jest potężny język poleceń, które pozwala użytkownikowi na manipulowanie plików zawierających kolumny danych i smyczki. Awk jest niezwykle przydatna, zarówno dla ogólnego funkcjonowania uniksowych poleceń, a na redukcji danych (np. IRAF). Można również dowiedzieć się, jak korzystać z sed edytor strumieniowy. Wiele aplikacji awk przypominać te wykonywane na PC arkuszy kalkulacyjnych.

Plik ten zawiera wiele przykładów, jak używać awk. Mam skompilowany tej tabeli stopniowo w ciągu kilku lat, jak nauczyłem się nowych rzeczy. Każdy, kto redukuje dane z IRAF powinny nauczyć się podstaw AWK Nauka zrobić nawet prostych rzeczy, pozwoli zaoszczędzić dużo czasu w dłuższej perspektywie. Należy zajmie Ci mniej niż godziny na przeczytanie tego pliku i nauczyć się podstaw.

Istnieją dwa sposoby uruchamiania awk. Proste polecenie awk można uruchomić z jednej linii komend. Bardziej złożone skrypty awk powinien być zapisany do pliku poleceń. I przedstawia przykłady obu typów wejściowych poniżej.

Awk wykonuje każdą linię wejścia i próbuje dopasować “wzór” (patrz poniżej), a jeżeli uda się to zrobić, co powiedzieć to zrobić w ciągu {} (tzw. action). Awk działa najlepiej na plikach, które mają kolumn liczb lub ciągów, które są oddzielone spacją (znak spacji lub tabulacji), choć na większości maszyn można użyć opcji-f, jeśli kolumny są rozstawione przez inną postać. Awk odnosi się do pierwszej kolumny $ 1, druga kolumna $ 2, itd., i na całej linii jako 0 zł. Jeśli masz plik (np. katalogu), które zawsze ma liczby w poszczególnych kolumnach, może również chcesz uruchomić polecenie ‘colrm “i połączyć je z awk. Jest to strona na colrm. Jest również bardzo niekompletny strona człowiek na awk.

Poprowadzę cię przez dwa przykłady. Po pierwsze, załóżmy, że masz plik o nazwie “plik1”, że ma 2 kolumny liczb, a chcesz utworzyć nowy plik o nazwie “plik2”, który ma kolumny 1 i 2, jak wcześniej, ale dodaje również trzecią kolumnę, która jest stosunkiem liczby w kolumnach 1 i 2. Załóżmy, że chcesz nowy, 3-kolumna plik (plik2) zawierać tylko te wiersze z kolumny 1 mniejszego niż kolumnie 2. Każda z dwóch poniższych poleceń robi, co chcesz:

awk ‘$ 1 plik2

– Lub –

cat plik1 | awk ‘$ 1 plik2

Spójrzmy na drugi. Wszyscy wiecie, że “kot plik1 ‘wypisuje zawartość plik1 do ekranu. | (Tzw. rura) kieruje wyjście ‘cat plik1’, które zwykle trafia do ekranu, do polecenia awk. Awk uważa wejście z ‘file1 Cat’ jednej linii na raz, i stara się dopasować “wzór”. Wzór jest to, co jest między pierwszym i {‘, w tym przypadku, jest wzór $ 1 file2 ‘.

Jako drugi przykład, załóżmy, że masz kilka tysięcy plików, które chcesz przenieść do nowego katalogu i zmienić nazwę przez dodanie. Dat po nazwach plików. Może to zrobić jeden po drugim (kilka godzin), lub używać vi do godnej pliku poleceń, aby to zrobić (kilka minut), lub użyć awk (kilka sekund). Załóżmy, że pliki są nazywane śmieci * (* jest wildcard dla dowolnego ciągu znaków), i muszą być przeniesione do .. / iraf i mieć “. DAT” dołączane do nazwy. Aby wykonać tego typu

junk ls * | awk ‘{. “dat” print “mv” $ 0 “.. / iraf /” $ 0}’ | csh

* junk ls wymienia nazwy plików, i to wyjście jest potokiem do awk zamiast do ekranu. Nie ma wzoru (nic pomiędzy “i {), więc awk wpływy, aby wydrukować coś dla każdej linii. Na przykład, jeśli dwie pierwsze linie z “* ls śmieciowego” wyprodukowany junk1 i junk2, odpowiednio, to awk będzie drukować:

mv junk1 .. / iraf/junk1.dat
mv junk2 .. / iraf/junk2.dat

W tym momencie mv polecenia są po prostu drukowane na ekranie. Aby wykonać polecenie bierzemy wyjście awk i rur z powrotem do systemu operacyjnego (C-shell). Stąd, aby zakończyć oświadczenie dodamy “| csh ‘.

Bardziej złożone skrypty awk musi być uruchamiany z pliku. Składnia takich przypadkach jest:

cat plik1 | awk-f a.awk> plik2

jeżeli plik1 jest plik wejściowy, plik2 jest plik wyjściowy i a.awk jest plikiem zawierającym polecenia awk. Poniższe przykłady, które zawierają więcej niż jedną linię awk musi być uruchamiany z plików.

Niektóre użyteczne zmienne awk zdefiniowane dla was są NF (liczba kolumn), NR (obecna linia awk pracuje nad), koniec (true jeżeli awk osiąga EOF), BEGIN (true zanim awk czyta niczego) i długość (liczba znaków w linii lub ciąg znaków). Istnieje również możliwość zapętlania, search (/) polecenie, polecenie substring (bardzo przydatne) i formacie druk dostępny. Istnieje logicznym | | (lub) i && (i), które mogą być stosowane w “wzór. Można zdefiniować i manipulować własne zdefiniowane przez użytkownika zmienne. Przykłady są przedstawione poniżej. Tylko bug wiem to to, że Sun wersja awk nie zrobi funkcji trygonometrycznych, choć robi logi. Jest coś, co nazywa się gawk (produkt Gnu), który robi kilka rzeczy niż awk Suna, ale są w zasadzie takie same. Zwróć uwagę na użycie “tak” polecenia poniżej. W połączeniu z “głowy” i “awk ‘zapisywania godzin typowania, jeśli masz dużo plików do analizy lub zmiany nazwy.

Powodzenia!

Przykład # jest znakiem komentarza do awk. “Pole” oznacza “kolumna”

# Wydrukuj pierwsze dwa pola w odwrotnej kolejności:
awk ‘{print $ 2, $ 1}’ plik

# Wydrukuj linie dłuższe niż 72 znaków:
awk ‘długości> 72’ plik

# Wydrukuj długość ciągu w 2. kolumnie
awk ‘{długość druku ($ 2)}’ plik

# Dodaj do pierwszej kolumny, suma wydruku i średnia:
{S + = $ 1}
END {print “suma”, s, “średnio”, s / NR}

# Wydrukuj pól w odwrotnej kolejności:
awk ‘{for (i = NF, i> 0, – i) print $ i}’ plik

# Wydrukuj ostatnią linię
{Line = $ 0}
END {print line}

# Wypisuje całkowitą liczbę wierszy, które zawierają słowo Pat
/ Pat / {nlines = nlines + 1}
END {print nlines}

# Wypisuje wszystkie linie pomiędzy start / stop par:
awk ‘/ start /, / stop /’ plik

# Wydrukuj wszystkie wiersze, których pierwsze pole jest inny od poprzedniego:
awk ‘$ 1 = prev {print; prev = $ 1}’ plik

# Wydrukuj 3 kolumny, jeśli kolumna 1> kolumna 2:
awk ‘$ 1> $ 2 {print $ 3}’ plik

# Wydrukuj wiersz, jeśli kolumna 3> kolumna 2:
awk ‘$ 3> $ 2’ plik

# Policz liczbę linii, na których kol. 3> col 1
awk ‘$ 3> 1 dolar {print i + “1”; i + +}’ plik

# Wydrukuj numer porządkowy, a następnie w kolumnie 1 pliku:
awk ‘{print NR, $ 1}’ plik

# Wydrukuj każdy wiersz po skasowaniu 2nd pole
awk ‘{$ 2 = “”; print}’ plik

# Wydrukuj hi 28 razy
tak | head -28 | awk ‘{print “hi”}’

# Wydrukuj hi.0010 do hi.0099 (użytkownicy IRAF UWAGA!)
tak | head -90 | awk ‘{printf (“% 2.0f hi00 \ n”, NR +9)}’

# Wydrukuj 4 liczb losowych między 0 i 1
tak | head -4 | awk ‘{print rand ()}’

# Wydrukuj 40 losowych liczb całkowitych modulo 5
tak | head -40 | awk ‘{print int (100 * rand ())% 5}’

# Wymień wszystkie pola jego wartości bezwzględnej
{For (i = 1; i <= NF; i = i +1) if ($ i 833, i -) {
printf “lprm-PLK% d \ n”, i
} Exit
}

Sformatowane wydruki są postaci printf (“format \ n”, wartość1, wartość2, … valueN)
na przykład printf (“howdy%-8s Co to jest bracie.% .2 f \ n”, $ 1, $ 2 * $ 3)
S = ciąg%
%-8s = 8 ciąg znaków wyrównane do lewej
% .2 F = liczba z 2 miejsca po.
% 6.2f = pole 6 znaków z 2 znaki po.
\ N to znak nowej linii
\ T jest zakładka

# Wydrukuj histogram częstotliwości kolumnie liczb
2 dolary 0,1) && ($ 2 0,2) && ($ 2 0,3) && ($ 2 0,4) && ($ 2 0,5) && ($ 2 0,6) && ($ 2 0,7) && ($ 2 0,8) && ($ 2 0,9) {nj = nj +1}
END {print na, nb, nc, nd, NE, NF, NG, nh, ni, nj, NR}

# Znajdź maksymalne i minimalne wartości, które istnieją w kolumnie 1
NR == 1 {m = $ 1, p = $ 1}
1 dolar> = m {m = $ 1}
$ 1 <= p {p = $ 1}
END {print "Max =" m ", Min =" P}

# Przykład definiowania zmiennych, wiele poleceń w jednym wierszu
NR == 1 {prev = $ 4; rozpowszechnienie = $ 1; prevb = $ 2, n = 0, suma = 0}
4 dolary = prev {print rozpowszechnienie, prevb, prev, suma / n, n = 0; suma = 0; prev = $ 4; rozpowszechnienie = $ 1; prevb = $ 2}
4 dolary prev == {n + +; suma = suma + $ 5 / $ 6}
END {print rozpowszechnienie, prevb, prev, suma / n}

# Przykład definiowania i korzystania z funkcji, wstawianie wartości do tablicy
# I robi całkowitą mod arytmetyczny (n). Skrypt ten znajduje liczbę dni
# Upłynęły od 1 stycznia 1901. (Od http://www.netlib.org/research/awkbookcode/ch3)
Funkcja daynum (y, m, d, dni, i, n)
{# 1 == 1 stycznia 1901
split ("31 28 31 30 31 30 31 31 30 31 30 31", dzień)
# 365 dni w roku, plus jeden dla każdego roku przestępnego
N = (Y-1901) 365 + int ((Y-1901) / 4)
if (y% 4 == 0) # rok skok od 1901 do 2099
dni [2] + +
for (i = 1, i <m, i + +)
n + = dni [i]
powrót n + d
}
{Print daynum ($ 1, $ 2, $ 3)}

# Przykład zastosowania podciągów
# Substr ($ 2,9,7) wybiera znaków 9 thru 15 kolumny 2
{Print "imarith", substr ($ 2,1,7) "-" $ 3 ". Out" substr ($ 2,5,3)}
{Print "imarith", substr ($ 2,9,7) "-" $ 3 ". Out" substr ($ 2,13,3)}
{Print "imarith", substr ($ 2,17,7) "-" $ 3 ". Out" substr ($ 2,21,3)}
{Print "imarith", substr ($ 2,25,7) "-" $ 3 ". Out" substr ($ 2,29,3)}

Comments are closed