日々之迷歩

世の中わからんことだらけ

ITが複雑で難しくなっていく様に翻弄される日々です。微力ながら共著させていただいた「シェル・ワンライナー160本ノック」をよろしくお願い申し上げます。

第18回シェル芸勉強会へ遠隔参加

シェルワンライナーの勉強会ですが、今回で18回目らしいです。問題作成と解説の上田さん、ありがとうございます。

今回も福岡からUstで遠隔参加したいと思い、福岡サテライト会場を開催いたしました。前回のAIP Cafeが使えなかったため場所探しにちょっと苦労したのですが、ベータソフト様の無料貸し出し会議室を使わせていただきました。会場ご担当者の方、ありがとうございました。

https://atnd.org/events/68638atnd.org

今回の参加者は私を含めて4人でした。残念ながら都合でキャンセルされた方々は、次回ご検討ください。 今回の失敗は、勉強会の様子を写真に収めなかったことです・・・会場の様子は下記のリンクをご覧いただきたい。

sites.google.com

勉強会の情報

勉強会主催者の上田さんが公開されているページをご覧ください。

b.ueda.tech b.ueda.tech

勉強会開始前

とにかく素晴らしい会場でした。福岡はIT系勉強会がやりやすい会場に恵まれているなあと思った次第です。 プロジェクターへのつなぎはRGBとHDMIに対応していました。 HDMIケーブルの方が長さに余裕があったため、次回お世話になることになったらHDMI出力アダプターを持って行こうと思います。

ベータソフト様のご好意で11時頃に会場を開けていただきました。 事前準備として、環境構築の確認、シェル芸勉強会でどんなことをやっているか、どんなコマンドを使っているか、Tukubaiコマンドとは?などお話しさせていただきました。

勉強会開始

皆さんで昼食に出た後、いよいよ勉強会開始です。

私のパソコンでUstの画面や問題をプロジェクターに映し出し、持って来た小型スピーカーで拡声というスタイルで参加しました。 2人はmacOS、2人はLinux(仮想環境含む)でした。

私なりの解答例を記載いたします。パソコンはMacでTukubai多用。便利だし・・・使わない場合はawkとかで頑張ることになる。

Q1

ポイントはTukubaiのyarr使って、同じキーのデータを横に並べてしまうということ。後はgrepでAND絞り込み。

$ cat text | yarr num=1
001 オトン オトン アカン
002 オカン
003 オトン ヤカン オカン
004 オカン
005 オトン ミカン アカン

$ cat text | yarr num=1 | grep 'オトン' | grep 'アカン' | awk '{print $1}'
001
005

ところで上記の解答をよく見ると・・・オトン・・・アカン・・・・・・あれ?アカン??

Q2

・・・ギブアップです。

aだけ、bだけ、両方、それぞれ単体なら出せるんだけどなあ〜と思ってたら、commコマンドの登場でした。 そう言えばどこかで出てきた記憶があるのですが、どこで出て来たんでしたっけ??

Q3

Tukubai使っちゃいました。grepでファイル名とデータ表示からtarrへのコンビネーションです。

$ grep '' * | tr : ' ' | tarr num=1
a 1
a 2
a 3
a 4
a 5
b 1
b 2
b 3
c 7
c 8
c 9

あとはsm2へ渡してキー毎に集計して完成です。出題者上田さんと考え方が同様な解答になりました。

$ grep '' * | tr : ' ' | tarr num=1 | sm2 1 1 2 2
a 15
b 6
c 24

Q4

データをよく見ると表になってるんですねこれ。 Tukubaiのunmap使うと簡単でした。

$ cat cross | sed 's/\(.\)/\1 /g' | unmap num=1
a a _
a b x
a c _
a d _
a e _
....
f d x
f e _
f f _

後はxで終わってる行だけ抜き出して加工すれば完成です。

$ cat cross | sed 's/\(.\)/\1 /g' | unmap num=1 | grep 'x$' | awk '{print $1"-"$2}'
a-b
f-d

Q5

簡単なようで難しかったですね。 改行を別の文字に変換したら?全体を1行にしてゴニョゴニョ??とかいろいろ悩んだ挙句撃沈しました。 空行以外に行番号をつけた後にuniqすればいいということでした。 出題者上田さんは、この問題が一番いい出来だったとのことでした。

しかしながらcat -sという解答例が飛び出してきました。catコマンドの-sオプションは初めて知りました。

Q6

画像を作れという問題です。 シェルプログラミング実用テクニックでそんなのやったな〜と思い出しましたが、残念ながらギブアップでした。 0と1で格子模様を作ってからの〜という技でした。格子模様作るにはGNU sed奇数行指定の1~2を使うとのことでした。

Q7

grepの-fオプションで、標準入力から検索文字列を読む技を使いました。 ただ、LANG=Cをつけなくてもちゃんと動きますね、あれ??

$ grep -o . chinese_characters | sort | uniq -d
㕐

$ grep -o . chinese_characters | sort | uniq -d | ggrep -f - -n chinese_characters 
6:㕐㕑㕒㕓㕔㕕㕖㕗㕘㕙㕚㕛㕜㕝㕞㕟
13:㗀㗁㗂㗃㗄㗅㗆㗇㗈㗉㕐㗊㗋㗌㗍㗎

Q8

・・・・無念ギブアップでした。 awkで文字の並びを2文字3文字・・と全て作り出すのがポイントでした。 福岡サテライト参加者の皆さんもオーバーヒート寸前だったので、簡単な例をデモさせていただきました。

シェル芸勉強会でよく出る集計パターンsort | uniq -c | sort -nrの例です。どの数字が一番たくさん使われているか?

$ cat number | grep -o . | sort | uniq -c | sort -nr
  15 2
  14 3
  14 1
  13 8
  12 0
  11 9
   6 6
   6 5
   5 4
   4 7

ということで答えは15回使われた2ですね。

終わりに

素晴らしい会場を提供していただいたり、初めての参加者ばかりだったり、いろいろと意義深い勉強会になったと思います。 問題の内容も充実していて、今回もホンマに脳みそコネコネでした。

終了後、参加者の方からシェル芸って関数型なデータ処理に似ているという意見が出ました。 Tukubaiのmapコマンドとかは同様な処理が関数型言語の機能であったりするし、ストリーム的に捌くところなんかも。 awkやuniqなどを始めて使われた方もいらっしゃいました。

そう言えば午前の部は、恐怖の素数ワンライナー作者鳥海さんによる、座学と思わせての脳みそコネコネで皆さん撃沈されたらしいですね。