awkで文字列を頭から階段状に出力させる

Twitter上でそういった処理についてebanさんがやられてたので、理解するため+忘れないために残しておく。

blacknon@BS-PUB-UBUNTU-01:~$ echo あいうえお | grep -o . | awk 'a=$0=a$0' #シェル芸
あ
あい
あいう
あいうえ
あいうえお

 

この処理、ぱっと見だと何をしているのかよくわからないのだが、変数aに前の行の内容を継続して代入して$0とセットで出力しているようだ。
以下の内容と同じ処理をしている様子(厳密には$0を上書きしている様子)。

awk '{a=a$0;print a}'
awk '{a=a$0;$0=a;print $0}'
blacknon@BS-PUB-UBUNTU-01:~$ echo あいうえお | grep -o . | awk '{a=a$0;print a}'
あ
あい
あいう
あいうえ
あいうえお
blacknon@BS-PUB-UBUNTU-01:~$ echo あいうえお | grep -o . | awk '{a=a$0;$0=a;print $0}'
あ
あい
あいう
あいうえ
あいうえお
Sponsored Links

以下のように応用してやることで、後ろから埋める処理についても行えた。
(スペース埋め)

echo abcde | grep -o . | tac | awk '{a=$0a;$0=a;printf("%5s\n",$0)}' # Unicodeでない場合
echo あいうえお | grep -o . | tac | awk '{a=$0a;$0=a;print $0}' | printf "%15s\n" $(cat) | sed 's/   / /g'
blacknon@BS-PUB-UBUNTU-01:~$ echo abcde | grep -o . | tac | awk '{a=$0a;$0=a;printf("%5s\n",$0)}' # Unicodeでない場合
e
de
cde
bcde
abcde
blacknon@BS-PUB-UBUNTU-01:~$ echo あいうえお | grep -o . | tac | awk '{a=$0a;$0=a;print $0}' | printf "%15s\n" $(cat) | sed 's/   / /g'
    お
   えお
  うえお
 いうえお
あいうえお

 

最後の文字を基準に回文みたいにして出力する場合。

echo abcde|grep -o .|tac|awk '{a=a?$0a$0:$0;print a}'|xargs -I@ bash -c 'printf "%*s\n" $(( (9 + $(printf @ | wc -c)) / 2 )) @'
echo abcde|grep -o .|awk '{a=a?a$0:$0;"echo "a"|rev|sed s/^.//"|getline b;printf "%*s",5-NR,"";printf "%s\n",a b}'
echo あいうえお| grep -o . | tac | awk '{a=a?$0a$0:$0;print a}' | xargs -I@ bash -c 'printf "%*s\n" $(( (27 + $(printf @ | wc -c)) / 2 )) @' | sed 's/   / /g'
blacknon@BS-PUB-UBUNTU-01:~$ echo abcde|grep -o .|tac|awk '{a=a?$0a$0:$0;print a}'|xargs -I@ bash -c 'printf "%*s\n" $(( (9 + $(printf @ | wc -c)) / 2 )) @'
e
ded
cdedc
bcdedcb
abcdedcba
blacknon@BS-PUB-UBUNTU-01:~$ echo abcde|grep -o .|awk '{a=a?a$0:$0;"echo "a"|rev|sed s/^.//"|getline b;printf "%*s",5-NR,"";printf "%s\n",a b}'
a
aba
abcba
abcdcba
abcdedcba
blacknon@BS-PUB-UBUNTU-01:~$ echo あいうえお| grep -o . | tac | awk '{a=a?$0a$0:$0;print a}' | xargs -I@ bash -c 'printf "%*s\n" $(( (27 + $(printf @ | wc -c)) / 2 )) @' | sed 's/   / /g'
    お
   えおえ
  うえおえう
 いうえおえうい
あいうえおえういあ

 

更に応用。

echo あいうえお|grep -o .|tac|awk '{a=a?$0a$0:$0;$0=a;printf("%9s\n",a)}'|tac|tee >(tac)|sed 's/  / /g;1i.' | uniq
echo あいうえお|grep -o .|awk '{a=a?a$0:$0;"echo "a"|rev|sed s/^.//"|getline b;printf("%9s\n",a b)}'|tac|tee >(tac)|sed 's/  / /g'|uniq
blacknon@BS-PUB-UBUNTU-01:~$ echo あいうえお|grep -o .|tac|awk '{a=a?$0a$0:$0;$0=a;printf("%9s\n",a)}'|tac|tee >(tac)|sed 's/  / /g;1i.' | uniq
.
あいうえおえういあ
 いうえおえうい
  うえおえう
   えおえ
    お
   えおえ
  うえおえう
 いうえおえうい
あいうえおえういあ
blacknon@BS-PUB-UBUNTU-01:~$ echo あいうえお|grep -o .|awk '{a=a?a$0:$0;"echo "a"|rev|sed s/^.//"|getline b;printf("%9s\n",a b)}'|tac|tee >(tac)|sed 's/  / /g'|uniq
あいうえおえういあ
 あいうえういあ
  あいういあ
   あいあ
    あ
   あいあ
  あいういあ
 あいうえういあ
あいうえおえういあ

 


Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

This article has 1 comments

  1. Pingback: コンソール上で文字列を指定した区切り文字で後ろから順に出力させる | 俺的備忘録 〜なんかいろいろ〜

Leave a Comment

メールアドレスが公開されることはありません。

*