awk '{print $1$1$1$1$1$1$1$1$1$1$1$1$1}'
公開されているように、必要な出力を得るために以下の出力をパイプすることができます。CodeGolf SEでアルファベット波を印刷する。
列を別の列にコピー/反復するより良い方法はありますか(垂直? )bashおよび/または他の* nixユーティリティを使用していますか?
for i in {0..25}; do
printf \\$( printf '%03o' $((i+65)) );
printf \\$( printf '%03o' $((-~i%26+65)) );
echo;
done
AB
BC
CD
DE
EF
FG
GH
HI
IJ
JK
KL
LM
MN
NO
OP
PQ
QR
RS
ST
TU
UV
VW
WX
XY
YZ
ZA
答え1
まず、2つのprintfs + 1つのエコーを単一のprintfに単純化できると思います。
for i in {0..25}; do
printf '%b%b\n' \\$( printf '%03o' $((i+65)) ) \\$( printf '%03o' $((-~i%26+65)) )
done
すべてをシェルに保持するには、ここで説明されているトリックを使用できます。printfコマンドを使用して文字をN回書きます、すなわち。
for i in {0..25}; do
printf "$(printf '%b%b' \\$( printf '%03o' $((i+65)) ) \\$( printf '%03o' $((-~i%26+65)) ))%.0s" {1..13}
printf \\n
done
またはもう少し透明に
for i in {0..25}; do
printf -v xy '%b%b' \\$( printf '%03o' $((i+65)) ) \\$( printf '%03o' $((-~i%26+65)) )
printf "${xy}%.0s" {1..13}
printf \\n
done
純粋なシェルを使用しない場合は、浮上するすべての文字ペアを繰り返すために使用できるいくつかの異なる技術があります。
Perlの乗算演算子の使用
. . . | perl -lne 'print $_ x 13'
sed ループの使用
. . . | sed -E ':a; /.{26}/! s/../&&/; ta'
実際、sedでも文字マッチングを実行できます。
$ printf \%b {A..Z} A \\n |
sed -E '/^Z/! s/(.)(.)/&\n\2/; P;D; b' | sed -E ':a; /.{26,}/! s/../&&/; ta'
ABABABABABABABABABABABABAB
BCBCBCBCBCBCBCBCBCBCBCBCBC
CDCDCDCDCDCDCDCDCDCDCDCDCD
DEDEDEDEDEDEDEDEDEDEDEDEDE
EFEFEFEFEFEFEFEFEFEFEFEFEF
FGFGFGFGFGFGFGFGFGFGFGFGFG
GHGHGHGHGHGHGHGHGHGHGHGHGH
HIHIHIHIHIHIHIHIHIHIHIHIHI
IJIJIJIJIJIJIJIJIJIJIJIJIJ
JKJKJKJKJKJKJKJKJKJKJKJKJK
KLKLKLKLKLKLKLKLKLKLKLKLKL
LMLMLMLMLMLMLMLMLMLMLMLMLM
MNMNMNMNMNMNMNMNMNMNMNMNMN
NONONONONONONONONONONONONO
OPOPOPOPOPOPOPOPOPOPOPOPOP
PQPQPQPQPQPQPQPQPQPQPQPQPQ
QRQRQRQRQRQRQRQRQRQRQRQRQR
RSRSRSRSRSRSRSRSRSRSRSRSRS
STSTSTSTSTSTSTSTSTSTSTSTST
TUTUTUTUTUTUTUTUTUTUTUTUTU
UVUVUVUVUVUVUVUVUVUVUVUVUV
VWVWVWVWVWVWVWVWVWVWVWVWVW
WXWXWXWXWXWXWXWXWXWXWXWXWX
XYXYXYXYXYXYXYXYXYXYXYXYXY
YZYZYZYZYZYZYZYZYZYZYZYZYZ
ZAZAZAZAZAZAZAZAZAZAZAZAZA
単一の sed 呼び出しで可能でなければなりません。
printf \%b {A..Z} A \\n |
sed -E ':1; /^Z/! s/(.)(.)/&\n\2/; :2; /.{26}\n/! s/../&&/; t2; P;D; b1'
しかし、外部のGNU拡張に頼らないと、終了条件を正しく取得できませんでした。
printf \%b {A..Z} A \\n |
sed -E ":1; /^Z/! s/(.)(.)/&\n\2/; :2; /.{26}(\n|\')/M! s/../&&/; t2; P;D; b1"
答え2
何らかの方法でコードを最適化しようとせずに(これは難しいことです!)、次のことができます。
x=$(printf ..statement1..)
y=$(printf ..statement2..)
それから単に
echo "$x$y$x$y$x$y$x$y$x$y...."
例えば
for i in {0..25}; do
x=$(printf \\$( printf '%03o' $((i+65)) ))
y=$(printf \\$( printf '%03o' $((-~i%26+65)) ))
echo "$x$y$x$y$x$y$x$y"
done
一つあるたくさんしかし、さまざまな最適化方法があります。