Twitter上でそういった処理についてebanさんがやられてたので、理解するため+忘れないために残しておく。
echo あいうえお | grep -o . | awk 'a=$0=a$0' #シェル芸
— eban (@eban) 2017年7月24日
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}'
あ
あい
あいう
あいうえ
あいうえお
以下のように応用してやることで、後ろから埋める処理についても行えた。 (スペース埋め)
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
あいうえおえういあ
あいうえういあ
あいういあ
あいあ
あ
あいあ
あいういあ
あいうえういあ
あいうえおえういあ