2012-10-23 7 views
5

Ho un semplice awk one liner che piega la riga successiva sulla linea corrente quando un dato pattern è abbinato. Eccolo:Che effetto ha un numero finale sul corpo di uno script awk?

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

con la seguente digitazione:

one 
two 
three 
four 
five 
six 

one 
two 
three 
four 

si ottiene:

one 
twothree 
four 
five 
six 

one 
twothree 
four 

Si noti che il "tre" è piegato con il "due" che è quello che Volevo accadere. Ho trovato questa soluzione (non ricordo dove) e ho pensato strano che il "1" finale sembrasse essere il pezzo mancante che ha prodotto l'effetto desiderato. Se lo togli, ricevi:

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

Come risultato. Quindi la mia domanda è: cosa fa il "1" finale e dove è documentato?

Grazie!

risposta

6

Per awk, 1 significa vero, e quando un'espressione è vera, awk stampa la riga corrente per impostazione predefinita.

Esempi:

  • awk '1' /etc/passwd stamperà l'intero file
  • awk '0' /etc/passwd sarà non stampa l'intero file

se sei bravo in aritmetica (o si dispone di immaginazione o di programmazione abilità), ci sono molti trucchi che puoi fare con questo comportamento.

3

"Il '1' alla fine di intero Awk one-liner stampa la linea modificata (è zucchero sintattico solo per" stampa "(che è esso stesso zucchero sintattico per" stampa $ 0 "))".

-catonmat

+0

Ah! Grazie per il link. Molto utile. – drsnyder

1

avete ottenuto la risposta alla tua domanda specifica, ma lo script postato è a rischio. Il primo argomento per printf è una stringa di formato, non dati. A volte puoi usarlo per stampare dati, ma solo quando è codificato nel tuo script, non quando lo leggi da un input. Guardate cosa succede se il vostro ingresso succede a contenere una stringa di formattazione printf:

$ 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 

Il modo corretto di scrivere la sceneggiatura è:

$ awk '/two/ { printf "%s",$1; next; } 1' file 
one 
two%sthree 
four 
Problemi correlati