Führende Nullen bei der Echo-der-Basis-Konvertierung erzwingen

Führende Nullen bei der Echo-der-Basis-Konvertierung erzwingen

ich versuche, eine Folge ternärer Werte zu erhalten, die wie folgt organisiert sind:

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 

dafür verwende ich:

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

aber ich bekomme

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

Wie kann ich die Ausgabe der fehlenden 0 im Ergebnis erzwingen, da diese als weitere Skriptparameter wichtig sind?

Antwort1

printfZum Formatieren der Zahlen verwenden Sie :

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

Außerdem muss nach keine leere Zeichenfolge eingefügt werden , und im regulären Ausdruck $iist keine Quantifizierung erforderlich .{1}

Es könnte schneller sein, die Klammernerweiterung in zsh, ksh93, bash oder zu verwenden yash -o braceexpand:

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

Antwort2

Die Schleife ist nicht wirklich notwendig, daher würde ich es so machen:

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

Dabei werden auf der linken Seite fünf Nullen hinzugefügt und anschließend die fünf Ziffern ganz rechts genommen, wobei jede Ziffer durch ein Leerzeichen von der nächsten getrennt wird.

Antwort3

Mit zshoder ksh93können Sie außerdem Folgendes tun:

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

Mit ksh93:

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

Mit zsh:

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

Leiten Sie sie alle an sed 's/./& /;s/ $//'(oder sed 's/./ &/2g'mit GNU sed) weiter, um Leerzeichen zwischen den Ziffern einzufügen. Oder mit zsh:

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

verwandte Informationen