
estou tentando obter uma sequência em valores ternários organizados assim:
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 isso eu uso:
for i in `seq 001 242`
do echo 'obase=3; '$i'' | bc | sed 's/\(.\{1\}\)/\1 /g'
done
mas eu consigo
1
2
1 0
1 1
....
2 2 2 2 2
Como posso forçar o eco do 0 ausente no resultado, pois eles são importantes para usar como outros parâmetros de script?
Responder1
Use printf
para formatar os números:
for i in $( seq 1 242 ) ; do
printf '%05d\n' $( bc <<< 'obase=3; '$i )
done | sed 's/\(.\)/\1 /g'
Além disso, não há necessidade de colocar uma string vazia depois $i
e não há necessidade de quantificar {1}
no regex.
Pode ser mais rápido usar a expansão de chaves em zsh, ksh93, bash ou yash -o braceexpand
:
printf '%s\n' {0..2}\ {0..2}\ {0..2}\ {0..2}\ {0..2}
Responder2
O loop não é realmente necessário, então eu faria assim:
( echo "obase=3"; seq 1 242 ) |
bc |
sed -e 's!^!00000!' -e 's!^0*\(.....\)$!\1!' -e 's!.!& !g'
O que isto faz é adicionar cinco zeros ao lado esquerdo e depois pegar os cinco dígitos mais à direita, separando cada um do próximo com um espaço.
Responder3
Com zsh
ou ksh93
, você também pode fazer:
typeset -i3 i
for ((i = 1; i <= 242; i++)) { printf '%05d\n' "${i#*#}"; }
Com ksh93
:
printf '%05..3d\n' {1..242}
Com zsh
:
for ((i = 0; i <= 242; i++)) printf '%05d\n' $(([##3]i))
Canalize todos eles para sed 's/./& /;s/ $//'
(ou sed 's/./ &/2g'
com GNU sed
) para inserir espaços entre os dígitos. Ou com zsh
:
for ((i = 0; i <= 242; i++)) print ${(s::)${(l:5::0:)$(([##3]i))}}