シェルワンライナー160本ノック問題39
問題39 文章の折り返し
問題のファイルは
https://github.com/shellgei/shellgei160
からダウンロードできる。
30文字で文章を折り返す問題だった。
解答例は
cat bash_description.txt | sed 's/ / \n/g;s/$/ /' | awk '{L+=length}L>31{print "";L=length}{printf $0}' | awk 'sub(/ $/,"")'
となる。まず1単語1行となるように sed で変換する。そして2番目の awk では、最初のアクションで単語の長さを加える。次のアクションで累計の単語の長さが31を超えたらprint "" で改行を入れる。最後の printf では改行なしで単語を出力する。これによって文字幅30字を超えるまでは改行なしで単語が並び、超えたら改行されて次に行くという動作が実現する。最後の awk では awk を通すことで改行が入ることを活かして最終行に改行を入れつつ、最後尾の余計な空白を除去している。