2012-10-23 13 views
5

Mam prostą awk jedną wkładkę, która składa kolejny wiersz na bieżącą linię, gdy dany wzór jest dopasowany. Oto ona:Jaki wpływ ma liczba końcowa na treść skryptu awk?

awk '/two/ { printf $1; next; } 1' test.txt 

z następującego kodu:

one 
two 
three 
four 
five 
six 

one 
two 
three 
four 

otrzymasz:

one 
twothree 
four 
five 
six 

one 
twothree 
four 

Należy zauważyć, że "trzy" jest złożona z "dwa", który jest tym, co Chciałem wystąpić. Znalazłem to rozwiązanie (nie pamiętam gdzie) i pomyślałem, że to dziwne, że końcowy "1" okazał się brakującym elementem, który spowodował pożądany efekt. Jeśli wziąć go dostaniesz:

awk '/two/ { printf $1; next; }' test.txt 
twotwo 

jako wynik. Moje pytanie brzmi: co robi końcowy "1" i gdzie jest udokumentowany?

Dzięki!

Odpowiedz

6

Dla awk, 1 średnia prawda, a gdy wyrażenie jest prawdziwe, awk domyślnie drukuje bieżący wiersz.

Przykłady:

  • awk '1' /etc/passwd drukuje cały plik
  • awk '0' /etc/passwd będzie nie wydrukować cały plik

Jeśli jesteś dobry w arytmetyce (lub masz wyobraźnię lub programowania umiejętności), istnieje wiele sztuczek, które możesz zrobić z tym zachowaniem.

3

"The '1' na końcu całej linii Awk drukuje zmodyfikowaną linię (jest to cukier syntaktyczny dla" print "(który sam jest syntaktycznym cukrem dla" print $ 0 "))".

- catonmat

+0

ah! Dzięki za link. Bardzo pomocne. – drsnyder

1

Masz swoją odpowiedź do konkretnego pytanie, ale Twój pisał skrypt jest niebezpieczne. Pierwszym argumentem dla printf jest ciąg formatujący, a nie dane. Czasami można go użyć do drukowania danych, ale tylko wtedy, gdy jest zakodowany w skrypcie, a nie podczas odczytu z wejścia. Spójrz, co się dzieje, jeśli wejście dzieje zawierają ciąg printf formatowania:

$ cat file 
one 
two%s 
three 
four 

$ awk '/two/ { printf $1; next; } 1' file 
one 
awk: cmd. line:1: (FILENAME=file2 FNR=2) fatal: not enough arguments to satisfy format string 
     `two%s' 
      ^ran out for this one 

Prawidłowy sposób napisać skrypt:

$ awk '/two/ { printf "%s",$1; next; } 1' file 
one 
two%sthree 
four 
Powiązane problemy