
Я пытаюсь получить последовательность троичных значений, организованную следующим образом:
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))}}