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