情報処理の基本とも言うべきシェルワンライナーの勉強会。今回で18回目らしい。開催される方々の準備や勉強会運営には本当に頭が下がる想いである。
今回も福岡からUstで遠隔参加したいと思い、福岡サテライト会場を開催した。前回のAIP Cafeが使えなかったため場所探しにちょっと苦労したのだが、ベータソフト様の無料貸し出し会議室を使わせていただいた。大変感謝である。
今回の参加者は私を含めて4人。残念ながら都合でキャンセルされた方々は、次回ご検討いただければ。今回の失敗は、勉強会の様子を写真に収めなかったことである・・・会場の様子は下記のリンクをご覧いただきたい。
とにかく素晴らしい会場だった。福岡はIT系勉強会がやりやすい会場に恵まれているなあと思った次第である。プロジェクターへのつなぎはRGBとHDMIに対応していた。HDMIケーブルの方が長さに余裕があったため、次回お世話になることになったらHDMI出力アダプターを持って行ったほうがいいかも。
ベータソフト様のご好意で11時頃に会場を開けていただいた。事前準備として、環境構築の確認、シェル芸勉強会でどんなことをやっているか、どんなコマンドを使っているか、Tukubaiコマンドとは?などお話しさせていただいた。皆さんで昼食に出た後、いよいよ勉強会開始。
私のパソコンでUstの画面や問題をプロジェクターに映し出し、持って来た小型スピーカーで拡声というスタイルでの参加。2人はMac、2人はLinux(仮想環境含む)。
問題と解答は、下記の会長ブログを参照のこと。
【問題と解答】第18回ニンニク入れますかシェル芸勉強会 | 上田ブログ
解答例
私なりの解答例。パソコンは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
という飛び道具が炸裂し、あまりにも簡単な問題に早変わりしていた・・・
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などを始めて使われた方もいらっしゃった。これを機会にテキスト処理系コマンドに慣れていただければいいなあ。Tukubaiコマンドの便利さも感じてもらえたのではないか。
そう言えば午前の部は、恐怖の素数ワンライナー作者鳥海さんによる、座学と思わせての脳みそコネコネで皆さん撃沈したとか何とか・・・