Forçar zeros à esquerda no eco da conversão de base

Forçar zeros à esquerda no eco da conversão de base

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 printfpara 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 $ie 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 zshou 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))}}

informação relacionada