AWK - Pretty Printing

Finora abbiamo utilizzato AWK print e printffunzioni per visualizzare i dati sullo standard output. Ma printf è molto più potente di quello che abbiamo visto prima. Questa funzione è presa in prestito dal linguaggio C ed è molto utile durante la produzione di output formattato. Di seguito è riportata la sintassi dell'istruzione printf:

Sintassi

printf fmt, expr-list

Nella sintassi sopra fmt è una stringa di specifiche di formato e costanti. expr-list è un elenco di argomenti corrispondenti agli identificatori di formato.

Sequenze di escape

Simile a qualsiasi stringa, il formato può contenere sequenze di escape incorporate. Di seguito sono discusse le sequenze di escape supportate da AWK -

Nuova linea

Viene stampato il seguente esempio Hello e World in righe separate usando il carattere di nuova riga -

Example

[jerry]$ awk 'BEGIN { printf "Hello\nWorld\n" }'

Eseguendo questo codice, ottieni il seguente risultato:

Output

Hello
World

Tab orizzontale

L'esempio seguente utilizza una tabulazione orizzontale per visualizzare un campo diverso:

Example

[jerry]$ awk 'BEGIN { printf "Sr No\tName\tSub\tMarks\n" }'

Eseguendo il codice sopra, ottieni il seguente risultato:

Output

Sr No   Name    Sub Marks

Tab verticale

L'esempio seguente utilizza una tabulazione verticale dopo ogni file:

Example

[jerry]$ awk 'BEGIN { printf "Sr No\vName\vSub\vMarks\n" }'

Eseguendo questo codice, ottieni il seguente risultato:

Output

Sr No
   Name
      Sub
         Marks

Backspace

L'esempio seguente stampa un backspace dopo ogni campo tranne l'ultimo. Cancella l'ultimo numero dai primi tre campi. Per esempio,Field 1 viene visualizzato come Field, perché l'ultimo carattere viene cancellato con backspace. Tuttavia, l'ultimo campoField 4 viene visualizzato così com'è, poiché non avevamo un file \b dopo Field 4.

Example

[jerry]$ awk 'BEGIN { printf "Field 1\bField 2\bField 3\bField 4\n" }'

Eseguendo questo codice, ottieni il seguente risultato:

Output

Field Field Field Field 4

Ritorno in carrozza

Nell'esempio seguente, dopo aver stampato ogni campo, eseguiamo un file Carriage Return e stampa il valore successivo sopra il valore stampato corrente. Significa che, nell'output finale, puoi solo vedereField 4, poiché era l'ultima cosa da stampare sopra tutti i campi precedenti.

Example

[jerry]$ awk 'BEGIN { printf "Field 1\rField 2\rField 3\rField 4\n" }'

Eseguendo questo codice, ottieni il seguente risultato:

Output

Field 4

Avanzamento modulo

L'esempio seguente utilizza l'avanzamento modulo dopo la stampa di ogni campo.

Example

[jerry]$ awk 'BEGIN { printf "Sr No\fName\fSub\fMarks\n" }'

Eseguendo questo codice, ottieni il seguente risultato:

Output

Sr No
   Name
      Sub
         Marks

Identificatore di formato

Come nel linguaggio C, AWK ha anche identificatori di formato. La versione AWK dell'istruzione printf accetta i seguenti formati di specifica di conversione:

% c

Stampa un singolo carattere. Se l'argomento utilizzato per%cè numerico, viene trattato come un carattere e stampato. In caso contrario, si presume che l'argomento sia una stringa e viene stampato l'unico primo carattere di quella stringa.

Example

[jerry]$ awk 'BEGIN { printf "ASCII value 65 = character %c\n", 65 }'

Output

Eseguendo questo codice, ottieni il seguente risultato:

ASCII value 65 = character A

% de% i

Stampa solo la parte intera di un numero decimale.

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %d\n", 80.66 }'

Eseguendo questo codice, ottieni il seguente risultato:

Output

Percentags = 80

% e e% E

Stampa un numero in virgola mobile nella forma [-] d.dddddde [+ -] dd.

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %E\n", 80.66 }'

Eseguendo questo codice, ottieni il seguente risultato:

Output

Percentags = 8.066000e+01

Il %E formato utilizza E invece di e.

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %e\n", 80.66 }'

Eseguendo questo codice, ottieni il seguente risultato:

Output

Percentags = 8.066000E+01

% f

Stampa un numero in virgola mobile nella forma [-] ddd.dddddd.

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %f\n", 80.66 }'

Eseguendo questo codice, ottieni il seguente risultato:

Output

Percentags = 80.660000

% ge% G

Utilizza la conversione% eo% f, a seconda di quale è più breve, con gli zeri non significativi soppressi.

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %g\n", 80.66 }'

Output

Eseguendo questo codice, ottieni il seguente risultato:

Percentags = 80.66

Il %G formato utilizza %E invece di% e.

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %G\n", 80.66 }'

Eseguendo questo codice, ottieni il seguente risultato:

Output

Percentags = 80.66

% o

Stampa un numero ottale senza segno.

Example

[jerry]$ awk 'BEGIN { printf "Octal representation of decimal number 10 = %o\n", 10}'

Eseguendo questo codice, ottieni il seguente risultato:

Output

Octal representation of decimal number 10 = 12

% u

Stampa un numero decimale senza segno.

Example

[jerry]$ awk 'BEGIN { printf "Unsigned 10 = %u\n", 10 }'

Eseguendo questo codice, ottieni il seguente risultato:

Output

Unsigned 10 = 10

%S

Stampa una stringa di caratteri.

Example

[jerry]$ awk 'BEGIN { printf "Name = %s\n", "Sherlock Holmes" }'

Eseguendo questo codice, ottieni il seguente risultato:

Output

Name = Sherlock Holmes

% x e% X

Stampa un numero esadecimale senza segno. Il%X il formato utilizza lettere maiuscole anziché minuscole.

Example

[jerry]$ awk 'BEGIN { 
   printf "Hexadecimal representation of decimal number 15 = %x\n", 15
}'

Eseguendo questo codice, ottieni il seguente risultato:

Output

Hexadecimal representation of decimal number 15 = f

Ora usa% X e osserva il risultato -

Example

[jerry]$ awk 'BEGIN { 
   printf "Hexadecimal representation of decimal number 15 = %X\n", 15
}'

Eseguendo questo codice, ottieni il seguente risultato:

Output

Hexadecimal representation of decimal number 15 = F

%%

Stampa un singolo % carattere e nessun argomento viene convertito.

Example

[jerry]$ awk 'BEGIN { printf "Percentags = %d%%\n", 80.66 }'

Eseguendo questo codice, ottieni il seguente risultato:

Output

Percentags = 80%

Parametri opzionali con%

Con % possiamo utilizzare i seguenti parametri opzionali:

Larghezza

Il campo è imbottito al width. Per impostazione predefinita, il campo è riempito con spazi ma quando viene utilizzato il flag 0, viene riempito con zeri.

Example

[jerry]$ awk 'BEGIN { 
   num1 = 10; num2 = 20; printf "Num1 = %10d\nNum2 = %10d\n", num1, num2 
}'

Eseguendo questo codice, ottieni il seguente risultato:

Output

Num1 =         10
Num2 =         20

Zeri iniziali

Uno zero iniziale funge da flag, che indica che l'output deve essere riempito con zeri anziché spazi. Si noti che questo flag ha effetto solo quando il campo è più largo del valore da stampare. Il seguente esempio descrive questo:

Example

[jerry]$ awk 'BEGIN { 
   num1 = -10; num2 = 20; printf "Num1 = %05d\nNum2 = %05d\n", num1, num2 
}'

Eseguendo questo codice, ottieni il seguente risultato:

Output

Num1 = -0010
Num2 = 00020

Giustificazione a sinistra

L'espressione dovrebbe essere giustificata a sinistra all'interno del suo campo. Quando la stringa di input è inferiore al numero di caratteri specificato e si desidera che sia giustificata a sinistra, ovvero aggiungendo spazi a destra, utilizzare un simbolo meno (-) immediatamente dopo la% e prima del numero.

Nell'esempio seguente, l'output del comando AWK viene reindirizzato al comando cat per visualizzare il carattere END OF LINE ($).

Example

[jerry]$ awk 'BEGIN { num = 10; printf "Num = %-5d\n", num }' | cat -vte

Eseguendo questo codice, ottieni il seguente risultato:

Output

Num = 10   $

Segno di prefisso

Aggiunge sempre un segno ai valori numerici, anche se il valore è positivo.

Example

[jerry]$ awk 'BEGIN { 
   num1 = -10; num2 = 20; printf "Num1 = %+d\nNum2 = %+d\n", num1, num2 
}'

Eseguendo questo codice, ottieni il seguente risultato:

Output

Num1 = -10
Num2 = +20

Hash

Per% o, fornisce uno zero iniziale. Per% x e% X, fornisce rispettivamente uno 0x o 0X iniziale, solo se il risultato è diverso da zero. Per% e,% E,% f e% F, il risultato contiene sempre un punto decimale. Per% ge% G, gli zeri finali non vengono rimossi dal risultato. Il seguente esempio descrive questo:

Example

[jerry]$ awk 'BEGIN { 
   printf "Octal representation = %#o\nHexadecimal representaion = %#X\n", 10, 10
}'

Eseguendo questo codice, ottieni il seguente risultato:

Output

Octal representation = 012
Hexadecimal representation = 0XA