第29回激しいシェル芸勉強会に参加した

はじめてシェル芸勉強会に現地参加した。すごい強い人が多くて怖い..。

問題と模範解答は以下から。

【問題と解答】第29回激しいシェル芸勉強会 – 上田ブログ

Q1

joinコマンドを使えばうまく結合できる.

$ join -a 1 -a 2 kadai1 kadai2

001 山田 20 山田 20
002 出川 30
003 上田 15
004 今泉 22
005 鳥海 44 鳥海 44

Q2

このあたりはまだ理解できた.

$ join -a 1 -a 2 attend <(cat attend6 | tr ',' '\n' | sort | sed 's/$/ 出/g') | awk '{ if ($4 != "") print $0; else print $0 "欠"}'|sed 's/ 出$/出/g'

Q3

ここは解答を見てなるほどなぁ…と思った。

$ join -a 1 -o 1.1,1.2,1.3,2.2 -e 0 attend test | awk '/(.*欠){3}/{$4=0}{print}'

-eで埋められる。joinの-oはカンマ区切りとスペース区切りの違いがある。MacとBSDは注意。

Q4

これ以降は厳しかった..。答え見ながら復習。

$ cat q4-1 | tr ' ' '\n' | sort -n | awk 'length(a)!=length($1){print ""}{printf("%d ",$1);a=$1}'|awk NF

-11
> -9 -1
> 2 4 5
> 42 44
> 311 421

Q5

ここも答えみながら復習。

$ cat triangle | awk '{for(i=NF;i<=3;i++)printf " 0";print}'|xargs -n 4 | tac | rs -T

ここで使っているrs -Tがかなり強力で行と列の入れ替えが出来てしまう.

Q6

ここは自分なりに少しがんばれた。

【シェル芸人】10000 までの素数を出力するコマンド【Linux】 – oki2a24

上記サイトを参考にした.

echo -e $(join -a 1 -a 2 -o 1.1 2.1 -e "\n" <(seq 2 100 | factor | awk 'NF==2{print $2}') <(cat prime | tr ' ' '\n')|awk '{print $2}'|tr '\n' ' ')|grep -v '^$'

join -a 1 -a 2 -o 2.1 -e "br" <(seq 2 100|factor|awk 'NF==2{print $2}') <(cat prime | tr ' ' '\n')|tr '\n' ' '|sed "s/br */\n/g"|grep -v '^$'

Q7-8

これはかなり難しい。職人芸というほかない..。

w3mでも解答になるのが面白かった.

まとめ

シェル芸勉強会はリモート参加以上に現地参加は面白かった。awkをもっと勉強したいと思った。今度参加する時は懇親会にも参加したい。