다음과 같이 구성된 일련의 삼항 값을 얻으려고 합니다.
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'
이것이 하는 일은 왼쪽에 5개의 0을 추가한 다음 가장 오른쪽의 5개 숫자를 취하고 각 숫자를 다음 숫자와 공백으로 구분하는 것입니다.
답변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))}}