
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 printf
para 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 $i
y 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 zsh
o 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))}}