Принудительно вставлять ведущие нули в эхо преобразования базы

Принудительно вставлять ведущие нули в эхо преобразования базы

Я пытаюсь получить последовательность троичных значений, организованную следующим образом:

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 

Для этого я использую:

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

но я получаю

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

Как принудительно вывести отсутствующие 0 в результате, если они важны для использования в качестве других параметров скрипта?

решение1

printfДля форматирования чисел используйте :

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

Кроме того, нет необходимости помещать пустую строку после $iи не нужно выполнять квантификацию {1}в регулярном выражении.

Возможно, быстрее будет использовать раскрытие фигурных скобок в zsh, ksh93, bash или yash -o braceexpand:

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

решение2

Цикл на самом деле не нужен, поэтому я бы сделал так:

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

Это делается путем добавления пяти нулей к левой стороне, а затем взятия пяти крайних правых цифр, при этом каждая цифра отделяется от следующей пробелом.

решение3

С помощью zshили ksh93вы также можете сделать:

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

С ksh93:

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

С zsh:

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

Передайте их все в sed 's/./& /;s/ $//'(или sed 's/./ &/2g'с помощью GNU sed), чтобы вставить пробелы между цифрами. Или с помощью zsh:

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

Связанный контент