2013-03-26 11 views
7

in awk:

1 tolower($1) ~ /mary/ { print "CI Record: " $0; } 
2 $0 !~ /Mary/ { print "Not Mary: " $0; } 
3 $1 == "Mary" { print "Mary Record: " $0; } 

Dlaczego 1 i 3 porównać $1 i 2 użyciu $0?

+4

Nie powinieneś nawet rozważać używania awk, dopóki nie będziesz w stanie odpowiedzieć na te pytania z łatwością, ponieważ są one absolutnie podstawowe. To tak, jakby pokazać nam problem z matematyką i zapytać, co znaczy "+". Zdobądź książkę Efektywne programowanie awk, wydanie trzecie według Arnolda Robbinsa. –

+0

Uzgodnione z @EdMorton. Przy okazji głosuję za ponownym otwarciem tego pytania: jego tytuł uruchamia wiele wizyt, a właściwa odpowiedź z dobrym wyjaśnieniem może dać jasność na ten temat. – fedorqui

Odpowiedz

7

Właściwie przykład # 2 używa regex powodu tej składni

/regex/ 

co oznacza, że ​​w swoim przykładzie, że jeśli tekst dosłowny Mary nie jest nigdzie w całej linii ($0), a następnie wykonać kod awk.

Podczas gdy $1 == "Mary" dokonuje bezpośredniego porównania literalnego tekstu Mary i pola nr 1 ($1).

Wreszcie tolower($1) ~ /mary/ ponownym użyciem ignre-case regex mecz na polu # 1, a to oznacza, że ​​jeśli $1 ma tekst mary (ignorować przypadków), a następnie wykonać resztę kodu awk.

17

W awk, $0 to cała linia argumentów, natomiast $1 to tylko pierwszy argument na liście argumentów oddzielonych spacjami. Więc jeśli wstawię "Mary ma małą jagnię" przez awk, $1 to "Mary", ale $0 to "Mary miała małą owieczkę". Druga linia próbuje znaleźć podciąg "Mary" w całej linii podanej do awk.

2

Z opisu w linku (kopalnia nacisk):

Wyrażenie jest na ogół albo jedno z pól lub w wyniku operację na jednym z pól.Na przykład, następujące AWK reguły filtrowania pokazać, odpowiednio, jak porównywać pierwsze pole do „Maria” w przypadku niewrażliwe mody, jak dopasować wszystkie rekordy że zrobić nie zawierają „Mary” i jak to zrobić dokładne porównanie dziedziniepierwszy przeciw „Mary”:

zatem jego rozbijania:

pierwszy z nich:

how to compare the first field to “mary” in a case-insensitive fashion 

Bo to porównując pierwsze pole, używa $1

jak dopasować wszystkie rekordy, które nie zawierają „Mary”

Ponieważ jest to porównując wszystkie rekordy, używa $0

Trzeci

i jak to zrobić dokładne porównanie pierwszym polu przeciw „Maryja”:

ponownie Porównując pierwsze pole, więc używa $1.