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

1

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\}\)/ /g'  
 done

mas eu obtenho

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

Como posso forçar o eco do zero ausente no resultado, pois eles são importantes para usar como outros parâmetros de script?

    
por Begoul 01.11.2016 / 17:43

3 respostas

5

Use printf para formatar os números:

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

Além disso, não é necessário colocar uma string vazia após $i e não é necessário quantificar {1} na 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}
    
por 01.11.2016 / 17:54
1

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*\(.....\)$!!' -e 's!.!& !g'

O que isto faz é adicionar cinco zeros ao lado esquerdo, e então pegar os cinco dígitos mais à direita, separando cada um dos seguintes com um espaço.

    
por 01.11.2016 / 17:58
0

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 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))}}
    
por 03.05.2017 / 14:04