列を列にコピーまたは繰り返し

列を列にコピーまたは繰り返し

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

純粋なシェルを使用しない場合は、浮上するすべての文字ペアを繰り返すために使用できるいくつかの異なる技術があります。

  1. Perlの乗算演算子の使用

    . . . | perl -lne 'print $_ x 13'
    
  2. 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"

おすすめ記事