Forzar ceros a la izquierda en eco de la conversión de base

Forzar ceros a la izquierda en eco de la conversión de base

Estoy intentando obtener una secuencia en valores ternarios organizados así:

0 0 0 0 1    
0 0 0 0 2    
0 0 0 1 0    
0 0 0 1 1  
.........  
.........  
2 2 2 2 2 

para eso uso:

 for i in `seq 001 242`  
 do echo  'obase=3; '$i'' | bc | sed  's/\(.\{1\}\)/\1 /g'  
 done

pero obtengo

1  
2  
1 0  
1 1  
....  
2 2 2 2 2  

¿Cómo puedo forzar el eco del 0 que falta en el resultado, ya que es importante usarlos como otros parámetros del script?

Respuesta1

Úselo printfpara formatear los números:

for i in $( seq 1 242 ) ; do
    printf '%05d\n' $( bc <<< 'obase=3; '$i )
done | sed  's/\(.\)/\1 /g'

Además, no es necesario colocar una cadena vacía después $iy no es necesario cuantificar {1}en la expresión regular.

Puede que sea más rápido utilizar la expansión de llaves en zsh, ksh93, bash o yash -o braceexpand:

printf '%s\n' {0..2}\ {0..2}\ {0..2}\ {0..2}\ {0..2}

Respuesta2

El bucle no es realmente necesario, así que lo haría así:

( echo "obase=3"; seq 1 242 ) |
    bc |
    sed -e 's!^!00000!' -e 's!^0*\(.....\)$!\1!' -e 's!.!& !g'

Lo que esto hace es agregar cinco ceros al lado izquierdo y luego tomar los cinco dígitos más a la derecha, separando cada uno del siguiente con un espacio.

Respuesta3

Con zsho ksh93, también puedes hacer:

typeset -i3 i
for ((i = 1; i <= 242; i++)) { printf '%05d\n' "${i#*#}"; }

Con ksh93:

printf '%05..3d\n' {1..242}

Con zsh:

for ((i = 0; i <= 242; i++)) printf '%05d\n' $(([##3]i))

Canalícelos todos a sed 's/./& /;s/ $//'(o sed 's/./ &/2g'con GNU sed) para insertar espacios entre los dígitos. O con zsh:

for ((i = 0; i <= 242; i++)) print ${(s::)${(l:5::0:)$(([##3]i))}}

información relacionada