AWK - Impresión bonita

Hasta ahora hemos utilizado AWK print y printffunciones para mostrar datos en la salida estándar. Pero printf es mucho más poderoso que lo que hemos visto antes. Esta función se toma prestada del lenguaje C y es muy útil al producir una salida formateada. A continuación se muestra la sintaxis de la declaración printf:

Sintaxis

printf fmt, expr-list

En la sintaxis anterior fmt es una cadena de especificaciones de formato y constantes. expr-list es una lista de argumentos correspondientes a especificadores de formato.

Secuencias de escape

Similar a cualquier cadena, el formato puede contener secuencias de escape incrustadas. A continuación se analizan las secuencias de escape admitidas por AWK:

Nueva línea

El siguiente ejemplo imprime Hello y World en líneas separadas usando el carácter de nueva línea -

Example

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

Al ejecutar este código, obtiene el siguiente resultado:

Output

Hello
World

Ficha horizontal

El siguiente ejemplo utiliza una pestaña horizontal para mostrar un campo diferente:

Example

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

Al ejecutar el código anterior, obtiene el siguiente resultado:

Output

Sr No   Name    Sub Marks

Ficha vertical

El siguiente ejemplo usa tabulación vertical después de cada archivo:

Example

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

Al ejecutar este código, obtiene el siguiente resultado:

Output

Sr No
   Name
      Sub
         Marks

Retroceso

El siguiente ejemplo imprime un retroceso después de cada campo excepto el último. Borra el último número de los primeros tres campos. Por ejemplo,Field 1 se muestra como Field, porque el último carácter se borra con retroceso. Sin embargo, el último campoField 4 se muestra como está, ya que no teníamos un \b después Field 4.

Example

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

Al ejecutar este código, obtiene el siguiente resultado:

Output

Field Field Field Field 4

Retorno de carro

En el siguiente ejemplo, después de imprimir cada campo, hacemos un Carriage Return e imprima el siguiente valor encima del valor impreso actual. Significa que, en la salida final, solo puede verField 4, ya que fue lo último que se imprimió encima de todos los campos anteriores.

Example

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

Al ejecutar este código, obtiene el siguiente resultado:

Output

Field 4

Alimentación de formulario

El siguiente ejemplo utiliza el avance de página después de imprimir cada campo.

Example

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

Al ejecutar este código, obtiene el siguiente resultado:

Output

Sr No
   Name
      Sub
         Marks

Especificador de formato

Como en el lenguaje C, AWK también tiene especificadores de formato. La versión AWK de la declaración printf acepta los siguientes formatos de especificación de conversión:

%C

Imprime un solo carácter. Si el argumento utilizado para%ces numérico, se trata como un carácter y se imprime. De lo contrario, se supone que el argumento es una cadena y se imprime el único primer carácter de esa cadena.

Example

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

Output

Al ejecutar este código, obtiene el siguiente resultado:

ASCII value 65 = character A

% d y% i

Imprime solo la parte entera de un número decimal.

Example

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

Al ejecutar este código, obtiene el siguiente resultado:

Output

Percentags = 80

% e y% E

Imprime un número de coma flotante de la forma [-] d.dddddde [+ -] dd.

Example

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

Al ejecutar este código, obtiene el siguiente resultado:

Output

Percentags = 8.066000e+01

los %E usos del formato E en lugar de e.

Example

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

Al ejecutar este código, obtiene el siguiente resultado:

Output

Percentags = 8.066000E+01

%F

Imprime un número de coma flotante de la forma [-] ddd.dddddd.

Example

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

Al ejecutar este código, obtiene el siguiente resultado:

Output

Percentags = 80.660000

% gy% G

Utiliza conversión% e o% f, lo que sea más corto, con los ceros no significativos suprimidos.

Example

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

Output

Al ejecutar este código, obtiene el siguiente resultado:

Percentags = 80.66

los %G usos del formato %E en lugar de% e.

Example

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

Al ejecutar este código, obtiene el siguiente resultado:

Output

Percentags = 80.66

% o

Imprime un número octal sin signo.

Example

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

Al ejecutar este código, obtiene el siguiente resultado:

Output

Octal representation of decimal number 10 = 12

% u

Imprime un número decimal sin signo.

Example

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

Al ejecutar este código, obtiene el siguiente resultado:

Output

Unsigned 10 = 10

% s

Imprime una cadena de caracteres.

Example

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

Al ejecutar este código, obtiene el siguiente resultado:

Output

Name = Sherlock Holmes

% x y% X

Imprime un número hexadecimal sin signo. los%X El formato utiliza letras mayúsculas en lugar de minúsculas.

Example

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

Al ejecutar este código, obtiene el siguiente resultado:

Output

Hexadecimal representation of decimal number 15 = f

Ahora use% X y observe el resultado:

Example

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

Al ejecutar este código, obtiene el siguiente resultado:

Output

Hexadecimal representation of decimal number 15 = F

%%

Imprime una sola % carácter y no se convierte ningún argumento.

Example

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

Al ejecutar este código, obtiene el siguiente resultado:

Output

Percentags = 80%

Parámetros opcionales con%

Con % podemos usar los siguientes parámetros opcionales:

Anchura

El campo se rellena al width. De forma predeterminada, el campo se rellena con espacios, pero cuando se usa la marca 0, se rellena con ceros.

Example

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

Al ejecutar este código, obtiene el siguiente resultado:

Output

Num1 =         10
Num2 =         20

Ceros a la izquierda

Un cero a la izquierda actúa como una bandera, lo que indica que la salida debe rellenarse con ceros en lugar de espacios. Tenga en cuenta que esta bandera solo tiene efecto cuando el campo es más ancho que el valor a imprimir. El siguiente ejemplo describe esto:

Example

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

Al ejecutar este código, obtiene el siguiente resultado:

Output

Num1 = -0010
Num2 = 00020

Justificación a la izquierda

La expresión debe estar justificada a la izquierda dentro de su campo. Cuando la cadena de entrada es menor que el número de caracteres especificado y desea que se justifique a la izquierda, es decir, agregando espacios a la derecha, use un símbolo menos (-) inmediatamente después del% y antes del número.

En el siguiente ejemplo, la salida del comando AWK se canaliza al comando cat para mostrar el carácter END OF LINE ($).

Example

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

Al ejecutar este código, obtiene el siguiente resultado:

Output

Num = 10   $

Signo de prefijo

Siempre antepone los valores numéricos con un signo, incluso si el valor es positivo.

Example

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

Al ejecutar este código, obtiene el siguiente resultado:

Output

Num1 = -10
Num2 = +20

Picadillo

Para% o, proporciona un cero a la izquierda. Para% x y% X, proporciona un 0x o 0X inicial, respectivamente, solo si el resultado es distinto de cero. Para% e,% E,% f y% F, el resultado siempre contiene un punto decimal. Para% gy% G, los ceros finales no se eliminan del resultado. El siguiente ejemplo describe esto:

Example

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

Al ejecutar este código, obtiene el siguiente resultado:

Output

Octal representation = 012
Hexadecimal representation = 0XA