【自習】第63回シェル芸勉強会【GNU sedたのしい】

印刷用データの作成と校正、母の入院等により、開催当日のリモート参加すらかなわず配信動画を見ながらの自習となりました。

ちなみに、大阪サテライト会場でふるまわれた和菓子の形状がかなり攻めたものだったようです。



Q1 (@butackle66さんから)

1×1〜9×9の九九の答えをすべて足し合わせてください。

A1

$ echo {1..9}*{1..9} | tr ' ' + | bc
2025

Q2 (@butackle66さんから)

9132円の支払いに10000円札で払ったときのおつりの出し方をひとつ(できるひとはたくさん)画面に出力してみてください。

A2

$ echo $((10000-9132)) | awk '{printf "おつり%d円:\n500円×%d\n100円×%d\n50円×%d\n10円×%d\n5円×%d\n1円×%d\n",$1,$1/500,($1%500)/100,(($1%500)%100)/50,((($1%500)%100)%50)/10,(((($1%500)%100)%50)%10)/5,(((($1%500)%100)%50)%10)%5}'
おつり868円:
500円×1
100円×3
50円×1
10円×1
5円×1
1円×3

Q3

次のLaTeXの原稿で、\label\refがペアになっていない(参照していない/されていない)ものを抽出してください。

$ cat genkou.tex
\begin{align}
        \Delta \V{x}_t \sim p( \Delta\V{x} | \V{x}_{t-1}, \V{u}_t) \label{eq:state_transition_model}
\end{align}
・・・
\footnote{
        $p$は\ref{eq:state_transition_model}とは異なる関数になりますが,

A3

$ grep -Po '\\(label|ref){.*?}' genkou.tex | tr { ' ' | sort -k2,2 | uniq -uf1 | tr ' ' {
\label{eq:state_equation_linear}
\label{eq:state_equation_nonlinear}
\ref{fig:typhoon}

Q4

次のファイルから、「東西南北」がワンセットになっている部分を探してください。東西南北の順番は問いません。

$ cat tonnan.txt
南西西南北東東西東北北南北西東東北北西北西西南北北西東東南東東西南東西北西北西南西北南東北西北西南北南北東東北南西東北南西西南西東北南東南西北西南東北南南西南北南東東西北西南南東東北南東南東東西北東南

A4

$ echo {東,西,南,北}{東,西,南,北}{東,西,南,北}{東,西,南,北} | tr ' ' '\n' | grep -Pv '(.).*\1' | xargs -I@ grep -bo @ tonnan.txt | awk -F: '{print $1/3+1":"$2}' | sort -n
3:西南北東
12:南北西東
33:南東西北
41:西北南東
43:南東北西
54:東北南西
55:北南西東
56:南西東北
57:西東北南
58:東北南西
63:南西東北
64:西東北南
68:東南西北
71:北西南東
72:西南東北
97:西北東南

Q5

つぎのリバーシの盤面について、E6とG7に❌を打ちたいです。

$ cat reversi.txt
 12345678
A        
B        
C   ⚪    
D   ⚪⚫   
E   ⚫⚫   
F    ⚪⚫  
G        
H        

つぎのワンライナーを完成させてください。(Perl使える人もこの問題はsedでお願いします。)

$ cat reversi.txt | sed あるsedのコード | sed 最初のsedのコードと同じコード

正規表現のなかに⚪もいれてください。

A5

$ cat reversi.txt | sed -Ez 's/(⚪⚫ .{9}) /\1❌/' | sed -Ez 's/(⚪⚫ .{9}) /\1❌/'
 12345678
A        
B        
C   ⚪    
D   ⚪⚫   
E   ⚫⚫❌  
F    ⚪⚫  
G      ❌ 
H        

Q6

Q5のワンライナーに続けて、⚪と❌の間の⚫を⚪にしてください。Perlは一回だけ使って良いこととします。

A6

# 最後の`sed`で、`t`コマンドを使って置換をループさせる
$ cat reversi.txt | sed -Ez 's/(⚪⚫ .{9}) /\1❌/' | sed -Ez 's/(⚪⚫ .{9}) /\1❌/' | sed -Ez ':x;s/⚫(.{10}❌)/❌\1/;t x;:w;s/❌(.{10}❌)/⚪\1/;t w'
 12345678
A        
B        
C   ⚪    
D   ⚪⚪   
E   ⚫⚪❌  
F    ⚪⚪  
G      ❌ 
H        

そのうち誰かがGNU sedでリバーシを実装するかもしれません。

Written on March 13, 2023