2009-06-15 22 views
21

¿Cuál es la mejor manera de rellenar números al imprimir la salida en bash, de modo que los números estén alineados a la derecha en la pantalla. Así que esto:números de alineación/almohadilla derecha en bash

00364.txt with 28 words in 0m0.927s 
00366.txt with 105 words in 0m2.422s 
00367.txt with 168 words in 0m3.292s 
00368.txt with 1515 words in 0m27.238 

se debe imprimir la siguiente manera:

00364.txt with 28 words in 0m0.927s 
00366.txt with 105 words in 0m2.422s 
00367.txt with 168 words in 0m3.292s 
00368.txt with 1515 words in 0m27.238 

estoy imprimir estos fuera línea por línea desde dentro de un bucle. Y sabré el límite superior en el número de palabras en un archivo (simplemente no ahora).

Respuesta

34

Para bash, utilice el comando printf con indicadores de alineación.

Por ejemplo:

printf '%7s' 'hello' 

Lienzo:

hello 

(Imagínese 2 plazas de allí)

Ahora, use su discreción para su problema.

+0

Wow, bien que era bastante fácil. Debería tener solo RTFM. Supongo que simplemente asumí incorrectamente que sería más difícil que eso en bash. ¡Gracias! – nedned

+0

Para eliminar el "7" codificado y ** calcular el relleno automáticamente **, consulte mi respuesta a continuación. –

22

Aquí es ejemplo un poco más claro:

#!/bin/bash 
for i in 21 137 1517 
do 
    printf "...%5d ...\n" "$i" 
done 

Produce:

... 21 ... 
... 137 ... 
... 1517 ... 
+0

Además, vea [esto] (http://stackoverflow.com/a/4410103/26428) y [este] (http://stackoverflow.com/a/2951428/26428). –

+0

Dennis: gracias por tomarse el tiempo para dar un claro ejemplo, sin obtener los puntos de respuesta correctos. – MaasSql

+0

Para eliminar el "5" codificado y calcular el relleno automáticamente, vea mi respuesta a continuación. –

9

Si usted está interesado en el cambio de ancho de forma dinámica, puede utilizar la función de printf '% * s'

printf '%*s' 20 hello 

que imprime

   hello 
+2

"dinámicamente", bueno, esto es shell, así que no veo cómo eso es diferente de 'printf"% $ {count} d "hello' –

+0

Esta es la mejor respuesta aquí, porque '% * s' toma en cuenta la longitud de la cuerda. Si lo hace 'printf '% * s' $ (tput cols) hello', hello se imprimirá en el borde más alejado de la ventana de la terminal. – Jonah

1

Una combinación de respuestas arriba que elimina la longitud de la cadena "5" codificada.

VALUES=(21 137 1517 2121567251672561) 
MAX=1 

# Calculate the length of the longest item in VALUES 
for i in "${VALUES[@]}"; do 
    [ ${#i} -gt ${MAX} ] && MAX=${#i} 
done 

for i in "${VALUES[@]}"; do 
    printf "... %*s ...\n" $MAX "$i" 
done 

Resultado:

...    21 ... 
...    137 ... 
...    1517 ... 
... 2121567251672561 ... 
Cuestiones relacionadas