第29回シェル芸勉強会まとめ

Pocket
LINEで送る

今回も共催の日本UNIXユーザ会様、会場提供のさくらインターネット様、参加者の皆様のご協力のもと、シェル芸勉強会を開催しました。

今回の問題は、ここ数回では難易度が下がったようで、会場では安堵の声、体力を奪われなかったという声が聞かれました(どんな会なんだ・・・)。

以下、単にリンクの貼り付け集ですが、当日の様子が分かるまとめです。

Twitterまとめ

録画

あと、大阪のLTの録画がありますが、それは大阪のレポートから辿っていただければと。

サテライト会場の様子

大阪、福岡で開いていただきました。ありがとうございました。

福岡

大阪

LTなどのスライドやブログ

大阪のLTは(やばすぎるので、ということではないですが)大阪からのレポートにお任せします。

ブログなどなど、書いたら教えてくださーい。

Pocket
LINEで送る

第28回基準値を超えるシェル芸勉強会のまとめ

Pocket
LINEで送る

参加者の方々、会場でお手伝いいただいた方々、サテライトの主催・参加のみなさま、会場を提供いただいたさくらインターネットさん、横田さん、午前講師の今泉さん、共催のjusさん並びにりゅうちさん、LT発表者のみなさま、ありがとうございました。

総括的なコメント

最近、会場の半分くらいの人たちのレベルが人間離れしていますが、初心者でも楽しめる雰囲気はキープできたかと・・・。問題は実用的かつ高難易度でした。

今回は募集が早すぎてドタキャンが多くゆったりめでした。

問題はこちらです。

話が前後しますが、午前の部は今泉さんのシグナルに関するレクチャーでした。ありがとうございました。個人的には擬似シグナル0番というのを知らなかったです。

当日の様子

Twitter上での様子

サテライトの様子

大阪のLTのスライドはこちらにあります。

LTやブログのリンク

写真など

昼食
LT

Pocket
LINEで送る

【問題のみ】第28回基準値を超えるシェル芸勉強会

Pocket
LINEで送る

解答例はこちら

問題で使うファイル等

GitHubにあります。ファイルは

https://github.com/ryuichiueda/ShellGeiData/tree/master/vol.28

にあります。

クローンは以下のようにお願いします。

$ git clone https://github.com/ryuichiueda/ShellGeiData.git

環境

解答例はUbuntu Linux 16.04 で作成。Macの場合はcoreutilsをインストールの上、gsedをつかいましょう。BSD系の人は玄人なので各自対応のこと。

注意

今回はいつにも増して一般解を出そうとすると死にますので、欲しい出力が得られればそれで良いということを心がけましょう。

イントロ

Q1

Q1.1

contents.txtについて、「\begin{figure}と\end{figure}」で囲まれた部分を全て抽出してください。

Q1.2

次のようなリストを作ってください。

世界座標系とロボットの姿勢 ./figs/coordinate.eps
計測値 ./figs/observation.eps
ランドマークの計測値から2点の相対姿勢を求める ./figs/two_poses.eps
ランドマークの計測値の不確かさを表す共分散行列 ./figs/observation_noise.eps

Q2

\sectionから始まる部分を章としたとき、第2章の第1文を抽出してみましょう。ただし、各行の%以降はコメントアウトされた文なので無視してください。

Q3

脚注(\footnote{…})の部分を全て抽出してください。一つだけ、脚注の中にも{}で囲まれた部分があるので注意してください。

Q4

各章(\sectionから次の\sectionまでの部分)を、ファイル名にタイトルをつけて個別のファイルに分けてください。ファイル名のスペースはアンダースコアに変えても構いません。

Q5

このテキストには「○○座標系」という用語がいくつか出てきます。○○にはカタカナか漢字の単語が入ります。これらの「○○座標系」を全通り抽出してください。

Q6

各段落の頭に全角スペースを入れてください。

Q7

本文のところだけ改行を取ってください。

Q8

contents.texについて、次のように章節項のリストを作ってください。

1 はじめに
2 問題
2.1 ロボットの姿勢と座標系
2.2 観測
2.2.1 ランドマークの識別
2.2.2 ランドマークの姿勢計測
2.2.3 計測値の記録
2.2.4 計測値の誤差
2.3 完全SLAM問題
3 graph-based SLAMの実装例
3.1 グラフのエッジを作る
3.1.1 $\V{\mu}_{c,t,t'}, \V{e}_{c,t,t'}$の計算
3.1.2 $\Sigma_{c,t,t'}, \Omega_{c,t,t'}$の計算
3.2 最適化問題を作る
3.2.1 マハラノビス距離
3.2.2 最適化する式
3.3 $\V{e}_{c,t,t'}$の勾配を求める
3.4 問題を解く
Pocket
LINEで送る

jus共催第27回シェル芸勉強会のリンク集

Pocket
LINEで送る

2017年2月11日(土曜日)にさくらインターネットさんにて開催しました。日本UNIXユーザ会(jus)さんとの共催でした。

sedに絞って機能を使ってみる出題にしたのでいつもより勉強会っぽい勉強会になりました。最後の三問が急に難しくなって「ハシゴを外された」との声もありましたが・・・。

酸化参加された皆様、会場を提供いただいたさくらインターネットさん横田さん、午前の部の講師の鳥海さん石井さん、ストリーミングを担当された宮川さん、濃いLT勢の皆様、jusのりゅうちさん、Twitter勢の皆様、そしてサテライト会場の皆様、ありがとうございました。

問題

 

録画

サテライト会場

まとめ

ブログ等

多すぎるので今回からまとめのところからのリンクで代用させていただきます・・・

番外編

翌日の別の勉強会で危険シェル芸が炸裂したそうです・・・

Vimシェル芸の予感・・・

Pocket
LINEで送る

【問題のみ】第26回シェル芸勉強会及びエクシェル芸勉強会

Pocket
LINEで送る

解答はコチラ

問題で使うファイル等

GitHubにあります。ファイルは

https://github.com/ryuichiueda/ShellGeiData/tree/master/vol.26

にあります。

クローンは以下のようにお願いします。

$ git clone https://github.com/ryuichiueda/ShellGeiData.git

環境

シェル芸を行うのはUbuntu Linux 16.04です。確認はMacのExcelやWord, PowerPointで行いました。今回は特にワンライナーにこだわる必要はありません。シェルスクリプトにしても構いません。もちろん、一般解にこだわる必要もありません。

イントロ

第26回シェル芸勉強会及びエクシェル芸勉強会

Q1

.xlsxや.docx、.pptxファイルはzipファイルです。リポジトリの中のxlsx,docx,pptxを展開し、中にどんなファイルがあるか見て、再び戻して再び.xlsxファイルとして開いてみてください。

Q2

20141019OSC_LT.pptxのスライドに何回「危険」という単語が出てくるか数えてください。画像になっているものは除きます。

Q3

20141019OSC_LT.pptxのスライドから画像を抽出して、一つのディレクトリにまとめてzipで固めてください。

Q4

20141019OSC_LT.pptxのスライドの7ページ目のテキストをスクレイピングしましょう。以下が出力の例です。

戦果(?)
初日だけで見知らぬ方のマシン3台轟沈
その他自爆者多数
Docker上で試したらホストマシン沈黙の報告
自分の本がサイト経由で1冊だけ売れた
フォロワーが1人減った
(以下、フッタ等の文字列が混ざっても可とします)

Q5

graph.xlsxの2列の数字を抜き出して端末にSSV形式のデータ(CSVのカンマがスペースになったもの)、あるいはセルの番号と値のリストとして抜き出してください。

Q6

hanshin.xlsxのシートについてQ2と同様SSV形式か、セルの番号と値のリストとして端末上に出力してください。日付のセルについては何を出力しても良いことにします。

Q7

certificate.docxファイルを開いて確認し、人の名前が入るところに好きな名前を入れてみましょう。

Q8

Q7を応用し、次のリストlist.txtで、複数の表彰状を作ってみましょう。

$ cat list.txt 
シェル芸おじさん
シェル芸野郎
変態シェル芸豚野郎
Pocket
LINEで送る

第23回梅雨でモワッとしたシェル芸勉強会リンク集

Pocket
LINEで送る

ネット上がシェル芸だらけであり。抜けがあったらご指摘を。

午前の部

サテライトの様子

ブログ

他流試合

LT資料

LT用(?)変態ツール

Pocket
LINEで送る

【問題と解答】第23回梅雨でモワッとしたシェル芸勉強会

Pocket
LINEで送る

問題だけのページはこちら

問題で使うファイル等

GitHubにあります。ファイルは

https://github.com/ryuichiueda/ShellGeiData/tree/master/vol.23

にあります。

クローンは以下のようにお願いします。

$ git clone https://github.com/ryuichiueda/ShellGeiData.git

環境

今回はUbuntu Linuxで解答例を作りましたので、BSD系、Macな方は以下の表をご参考に・・・。

Mac,BSD系 Linux
gdate date
gsed sed
tail -r tac
gtr tr
gfold fold

イントロ

スライド

Q1

まず、次のように、気象庁の毎月の台風の上陸数に関するデータをダウンロードし、landing.csvというファイルに保存してください。UTF-8に見えてもExcelから作ったCSVはBOM付きだったりするので、ネットから入手したデータは最初にnkfに通す癖を。

$ curl http://www.data.jma.go.jp/fcd/yoho/typhoon/statistics/landing/landing.csv |
 nkf -wLux > landing.csv

次にこのデータを、以下のようなデータ(ファイル名: monthly_typhoon)に変換してください。第1フィールドが年月、第2フィールドが台風の上陸頻度です。

$ head monthly_typhoon 
195101 0
195102 0
195103 0
195104 0
195105 0
195106 0
195107 1
195108 0
195109 0
195110 1
$ tail monthly_typhoon 
201503 0
201504 0
201505 0
201506 0
201507 2
201508 1
201509 1
201510 0
201511 0
201512 0

解答

$ cat landing.csv | awk -F, '{for(i=2;i<=13;i++){print $1,$i}}' |
  grep -v 年 | awk '{print $1 sprintf("%02d",(NR-1)%12+1),$2}' |
 awk 'NF==1{print $1,0}NF!=1' > monthly_typhoon

Q2

monthly_typhoonから年ごとの台風の上陸頻度を集計し、元のlanding.csvの最後のフィールドに描いてある上陸頻度と比較してデータに間違いがなさそうなことを確認してください。

解答

次のように書いて出力がなければ整合性が取れています。

$ cat monthly_typhoon |
 awk '{a[substr($1,1,4)]+=$2}END{for(k in a)print k,a[k]}' |
 sort | paste - <(tail -n +2 landing.csv | sed 's/,$/,0/') |
 tr , ' ' | awk '$1!=$3 || $2!=$NF'

Q3

これまでの統計について、各月に台風が上陸した率を求めましょう。

解答

$ cat monthly_typhoon | sed 's/^....//' |
 awk '$2==0{a[$1]++}$2!=0{b[$1]++}END{for(k in a){print k,b[k]/(a[k]+b[k])}}' |
 sort
01 0
02 0
03 0
04 0.0153846
05 0.0307692
06 0.138462
07 0.4
08 0.630769
09 0.630769
10 0.2
11 0.0153846
12 0

Q4

各年で最初に台風が上陸した月を抽出し、何月が何回だったか集計してください。

解答

まずこうすると各年で何月だったか分かります。

$ sed 's/^..../& /' monthly_typhoon | grep -v ' 0$' | uniq -w4

何月が何回だったかは次の通り。

$ sed 's/^..../& /' monthly_typhoon | grep -v ' 0$' | uniq -w4 |
 awk '{print $2}' | sort | uniq -c
      1 04
      2 05
      9 06
     21 07
     19 08
      7 09
      2 10

Q5

台風が上陸しなかった年を抽出してください。

解答

$ cat monthly_typhoon | sed 's/.. / /' | grep ' 0$' |
 uniq -c | awk '$1==12{print $2}'
1984
1986
2000
2008

Q6

まず、大阪市のページから、「平成27年 大阪市の犯罪発生情報 ひったくり」のデータを次のようにダウンロードして整形してください。なお、大阪を選んだ理由は2016年6月現在、ちゃんとテキストでこのようなデータを提供している大都市が他に見つからないからであり、他の意図があるわけではありません。また、なぜか女性の被害者のデータしかないのですが、気にしないことにします。

$ curl http://www.city.osaka.lg.jp/shimin/cmsfiles/contents/0000298/298810/006hittakuri2015.csv |
 nkf -wLux | tr , ' ' | tail -n +2 > hittakuri
$ head -n 5 hittakuri 
大阪市北区 曾根崎 1丁目付近 窃盗 既遂 ひったくり 自動二輪 2015年 1月 24日 2時頃 女性 20代
大阪市北区 兎我野町 付近 窃盗 既遂 ひったくり 自動二輪 2015年 2月 11日 20時頃 女性 20代
大阪市北区 曾根崎 2丁目付近 窃盗 既遂 ひったくり 自動二輪 2015年 4月 13日 3時頃 女性 20代
大阪市北区 曾根崎 2丁目付近 窃盗 既遂 ひったくり 自動二輪 2015年 4月 13日 2時頃 女性 40代
大阪市北区 角田町 付近 窃盗 既遂 ひったくり 自動二輪 2015年 4月 7日 3時頃 女性 20代

データは、大阪市からクリエイティブコモンズライセンスCC-BYで提供されているものです。

このデータについて、各区で何件ずつレコードがあるか確認してください。

解答

データの確認のため、あえて簡単にしてみました。

$ awk '{print $1}' hittakuri | sort | uniq -c
     19 大阪市阿倍野区
      8 大阪市旭区
      6 大阪市港区
      1 大阪市此花区
     29 大阪市住吉区
      9 大阪市住之江区
     23 大阪市城東区
     31 大阪市生野区
     28 大阪市西区
     37 大阪市西成区
      8 大阪市西淀川区
      7 大阪市大正区
     56 大阪市中央区
      6 大阪市鶴見区
     20 大阪市天王寺区
     15 大阪市都島区
     22 大阪市東住吉区
     18 大阪市東成区
     17 大阪市東淀川区
      9 大阪市福島区
     33 大阪市平野区
     53 大阪市北区
     31 大阪市淀川区
     22 大阪市浪速区

Q7

リポジトリのvol.23/OSAKAディレクトリに、各区の人口データ「population_h27sep」が入っています。このデータを使い、各区の人口当たりのひったくり件数のランキングを作ってください。

解答

指数表記になるとちゃんとソート順が変わる等面倒なので気をつけましょう。

$ awk '{print $1}' hittakuri | sort | uniq -c |
 awk '{print $2,$1}' | LANG=C sort | join - <(LANG=C sort population_h27sep) |
 awk '{printf("%s %7f\n",$1,$2/$3)}' | sort  -k2,2nr

Q8

同一住所で同日に2件以上ひったくりが起こった場合について、その住所と日付を出力してください。

解答

$ cat hittakuri | awk '{print $1$2$3,$8,$9,$10}' | sort | uniq -d
大阪市北区角田町付近 2015年 11月 4日
大阪市北区曾根崎2丁目付近 2015年 4月 13日
大阪市淀川区十三本町1丁目付近 2015年 4月 16日

Q9

ひったくりの手段とその成功率を求めてください。ただし、通報が行われなかった事件はなかったと仮定します。

解答

$ awk '{print $5,$7}' hittakuri | awk '$1=="既遂"{a[$2]++}{b[$2]++}END{for(k in a){print k,a[k]/b[k]}}'
徒歩 0.942308
自動車 0.904762
自転車 0.92053
自動二輪 0.954225
Pocket
LINEで送る

【問題】第23回梅雨でモワッとしたシェル芸勉強会

Pocket
LINEで送る

解答はこちら

問題で使うファイル等

GitHubにあります。ファイルは

https://github.com/ryuichiueda/ShellGeiData/tree/master/vol.23

にあります。

クローンは以下のようにお願いします。

$ git clone https://github.com/ryuichiueda/ShellGeiData.git

環境

今回はUbuntu Linuxで解答例を作りましたので、BSD系、Macな方は以下の表をご参考に・・・。

Mac,BSD系 Linux
gdate date
gsed sed
tail -r tac
gtr tr
gfold fold

イントロ

スライド

Q1

まず、次のように、気象庁の毎月の台風の上陸数に関するデータをダウンロードし、landing.csvというファイルに保存してください。UTF-8に見えてもExcelから作ったCSVはBOM付きだったりするので、ネットから入手したデータは最初にnkfに通す癖を。

$ $ curl http://www.data.jma.go.jp/fcd/yoho/typhoon/statistics/landing/landing.csv |
 nkf -wLux > landing.csv

次にこのデータを、以下のようなデータ(ファイル名: monthly_typhoon)に変換してください。第1フィールドが年月、第2フィールドが台風の上陸頻度です。

$ head monthly_typhoon 
195101 0
195102 0
195103 0
195104 0
195105 0
195106 0
195107 1
195108 0
195109 0
195110 1
$ tail monthly_typhoon 
201503 0
201504 0
201505 0
201506 0
201507 2
201508 1
201509 1
201510 0
201511 0
201512 0

Q2

monthly_typhoonから年ごとの台風の上陸頻度を集計し、元のlanding.csvの最後のフィールドに描いてある上陸頻度と比較してデータに間違いがなさそうなことを確認してください。

Q3

これまでの統計について、各月に台風が上陸した率を求めましょう。

Q4

各年で最初に台風が上陸した月を抽出し、何月が何回だったか集計してください。

Q5

台風が上陸しなかった年を抽出してください。

Q6

まず、大阪市のページから、「平成27年 大阪市の犯罪発生情報 ひったくり」のデータを次のようにダウンロードして整形してください。なお、大阪を選んだ理由は2016年6月現在、ちゃんとテキストでこのようなデータを提供している大都市が他に見つからないからであり、他の意図があるわけではありません。また、なぜか女性の被害者のデータしかないのですが、気にしないことにします。

$ curl http://www.city.osaka.lg.jp/shimin/cmsfiles/contents/0000298/298810/006hittakuri2015.csv |
 nkf -wLux | tr , ' ' | tail -n +2 > hittakuri
$ head -n 5 hittakuri 
大阪市北区 曾根崎 1丁目付近 窃盗 既遂 ひったくり 自動二輪 2015年 1月 24日 2時頃 女性 20代
大阪市北区 兎我野町 付近 窃盗 既遂 ひったくり 自動二輪 2015年 2月 11日 20時頃 女性 20代
大阪市北区 曾根崎 2丁目付近 窃盗 既遂 ひったくり 自動二輪 2015年 4月 13日 3時頃 女性 20代
大阪市北区 曾根崎 2丁目付近 窃盗 既遂 ひったくり 自動二輪 2015年 4月 13日 2時頃 女性 40代
大阪市北区 角田町 付近 窃盗 既遂 ひったくり 自動二輪 2015年 4月 7日 3時頃 女性 20代

データは、大阪市からクリエイティブコモンズライセンスCC-BYで提供されているものです。

このデータについて、各区で何件ずつレコードがあるか確認してください。

Q7

リポジトリのvol.23/OSAKAディレクトリに、各区の人口データ「population_h27sep」が入っています。このデータを使い、各区の人口当たりのひったくり件数のランキングを作ってください。

Q8

同一住所で同日に2件以上ひったくりが起こった場合について、その住所と日付を出力してください。

Q9

ひったくりの手段とその成功率を求めてください。ただし、通報が行われなかった事件はなかったと仮定します。

Pocket
LINEで送る

第22回シェル芸勉強会の感想とかまとめとか

Pocket
LINEで送る

本来は友の会のページに書くべきなのかもしれませんが、ちょっともう方々のページに書く時間的余裕もなく。

今回は午前の部も午後の部もLTもちと難しかったかと思いますが、初心者の方にも、「世の中にはおかしい人がいっぱいでおかしい人を見ておかしい人が喜んでいる風景」をお見せすることができたかと。一番下に書いたように今回は珍しく感情が出てしまったのですが、これからも緊張感の無い、全身の筋肉が弛緩してよだれがたれ流れる感じでやっていく所存。

まとめはこちらです。

サテライト

今回も大阪と福岡で。@papironさん@kunst1080さんありがとうございます。大阪は20名のご参加だったそうです。

あと、名古屋・・・みたいな話もTwitterでありましたが、こちらからプッシュして重荷にしてもいけないので、そういう話はあったと書くものの、マイペースでやっていただければと。

午前の部

全体的に、鳥海さんの暴走とりゅうちさんの優しい説教をみんなで見守る会となりました・・・。お二方ありがとうございました。

午後の部

個人的な感想だけ述べると、stというコマンドの存在や、sedでファイルの途中に別のファイルを差し込む方法を教えてもらえたので、より一層、シェル芸が捗る模様です。

問題はこちら。

懇親会・LT

毎回、「今回は前回よりは盛り上がらないだろう」とたかをくくっては失敗して腹筋が痛いのでどうかしている。

石井さんからシェル芸練習用Dockerイメージの話。りゅうちさんのjusについての発表、「金払った分のメリットはあるのか?」と詰め寄って大変申し訳なく。ぐれ氏はいつもと違って硬派なegzactというコマンド集のお披露目。むっつーさんはtrueコマンドに0以外の終了ステータスを出させる手法の第二報、「nlの大先生」という微妙な称号を得た@Carol_815氏はnlコマンドの話、東平さんからはコマンドラインからSelenium WebDriverを使ってウェブブラウザを操作する話。(抜けがあったらコッソリ教えてくだし・・・あ)

しかし、トリの鳥海さんの「ワンライナーでヒルベルト曲線を描く」というのが人智を超えていて、変な笑いしか出なかったです・・・

参加(リモートも含む)された方のブログ

検索で出てきたものだけ。

ちょっと後でモメた件

私が言わんでいいことを言ったので後でちょっとモメモメしました。勉強会が大きくなりすぎて大変なんでないかという声もありましたが、どちらかというと私の個人的な事情を勉強会の方に持ち込んでしまったというのが正確なところです。

気楽に来ていただきたいのですが、変に緊張させていたらよろしくないなと反省しております。

では、今度は周りの方と調整がついたら6月18日(土)の予定です。

今回の危険シェル芸

鳥海さん発案。

Pocket
LINEで送る

【問題と解答】第22回ゴールデンウィークの存在疑惑シェル芸勉強会

Pocket
LINEで送る

問題のみのページはこちら

イントロのプレゼン資料

ここです。

問題で使うファイル等

GitHubにあります。ファイルは

https://github.com/ryuichiueda/ShellGeiData/tree/master/vol.22

にあります。

クローンは以下のようにお願いします。

$ git clone https://github.com/ryuichiueda/ShellGeiData.git

環境

今回はUbuntu Linuxで解答例を作りましたので、BSD系、Macな方は以下の表をご参考に・・・。

Mac,BSD系 Linux
gdate date
gsed sed
tail -r tac
gtr tr
gfold fold

Q1

次のファイルの中身について、「cat <ファイル名>」から初めて、同じワンライナーでそれぞれ中央値を求めてください。データの数が偶数の場合は、中央の二つの値の平均を中央値とします。

ueda@remote:~/GIT/ShellGeiData/vol.22/Q1$ cat a
1
3
4
1
6
6
8
2
ueda@remote:~/GIT/ShellGeiData/vol.22/Q1$ cat b
3.4
13
4242
-4
-5

解答

データ数が偶数と奇数の時で場合分けが必要で面倒くさいです。(場合分けのない方法絶賛募集中。)

ueda@remote:~/GIT/ShellGeiData/vol.22/Q1$ cat a | sort -n |xargs |
awk 'NF%2==0{print 0.5*($(NF/2)+$(NF/2+1))}NF%2==1{print $(NF/2+1)}'
3.5
ueda@remote:~/GIT/ShellGeiData/vol.22/Q1$ cat b | sort -n | xargs |
awk 'NF%2==0{print 0.5*($(NF/2)+$(NF/2+1))}NF%2==1{print $(NF/2+1)}'
3.4

Q2

次のような出力から初めて、

ueda@remote:~$ echo カレーライス 醤油ラーメン | ...

次のような出力を得てください(表示がずれてますが、「ー」のところで文字列をクロスさせています)。最初のパイプより右側はマルチバイト文字を使わないようにしてみましょう。「ー」が何文字目にあるか等の情報は何でも使って結構です。

      カ
      レ
醤油ラーメン
      ラ
      イ
      ス

解答

ueda@remote:~$ echo カレーライス 醤油ラーメン |
 awk '{print $2;gsub(/./,"      &\n",$1);print $1}' |
 awk 'NR==1{a=$1}NR!=1{print $1==substr(a,4,1)?a:$0}'
      カ
      レ
醤油ラーメン
      ラ
      イ
      ス

Q3

次のデータについて、

ueda@remote:~/GIT/ShellGeiData/vol.22$ cat Q3
aaabbb
bababa
aaabbb
aaabbb
bababa
bbbbba

次のような出力を得てください。

bababa  2 5
aaabbb  1 3 4
bbbbba  6

次に、得られた答えから元のデータを復元してください。Q3の答えはQ3.ansにあります。

解答

前半はAWKの連想配列のおさらい問題でした。

ueda@remote:~/GIT/ShellGeiData/vol.22$ cat Q3 |
awk '{a[$1]=a[$1]" "NR}END{for(k in a){print k,a[k]}}' 
bababa  2 5
aaabbb  1 3 4
bbbbba  6

復元は次の通り。

ueda@remote:~/GIT/ShellGeiData/vol.22$ cat Q3.ans |
 awk '{for(i=2;i<=NF;i++)print $1,$i}' |
 sort -k2,2n | awk '{print $1}'
aaabbb
bababa
aaabbb
aaabbb
bababa
bbbbba

Q4

次のファイルについて、素数行目に存在するりんごとみかんをそれぞれ数えてください。できる人は素数の行を2,3,5,7と明示的に指定しないでやってみてください。

ueda@remote:~/GIT/ShellGeiData/vol.22$ cat Q4
りんご
りんご
みかん
みかん
りんご
みかん
りんご
りんご

解答

先にfactorを使ってからpasteでQ4ファイルをくっつけると楽です。

ueda@remote:~/GIT/ShellGeiData/vol.22$ seq 1 100 | factor |
 paste - Q4 | awk 'NF==3' | grep -oE '[あ-ん]+' | sort | uniq -c
      1 みかん
      3 りんご

Q5

足して10になる並びを全て見つけてみましょう。

ueda@remote:~/GIT/ShellGeiData/vol.22$ cat Q5
1 3 4 4 2 3 5 6 7 9 1 4

解答

計算量的には損ですが、先に組み合わせを全部列挙すると楽です。ただ、列挙は面倒くさいです。

ueda@remote:~/GIT/ShellGeiData/vol.22$ cat Q5 |
 awk '{for(len=1;len<=NF;len++)for(shift=1;shift<=NF-len+1;shift++)
{for(i=shift;i<shift+len;i++){printf $i" "};print ""}}' |
 awk '{a=0;for(i=1;i<=NF;i++)a+=$i;print $0,a}' | awk '$NF==10'
9 1  10
4 4 2  10
2 3 5  10

Q6

次のファイルQ6_1のX,Y,Zに、

ueda@remote:~/GIT/ShellGeiData/vol.22$ cat Q6_1 
所謂いわゆる「Z」というものにだって、
もっと何か表情なり印象なりがあるものだろうに、
YのからだにXでもくっつけたなら、
こんな感じのものになるであろうか、
とにかく、どこという事なく、見る者をして、
ぞっとさせ、いやな気持にさせるのだ。
私はこれまで、こんな不思議な男の顔を見た事が、
やはり、いちども無かった。

Q6_2に書いてある文字列を当てはめてください。

ueda@remote:~/GIT/ShellGeiData/vol.22$ cat Q6_2
X 駄馬の首
Y 人間
Z 死相

解答

sedでsedのコマンドを作ってsedに食わせます。

ueda@remote:~/GIT/ShellGeiData/vol.22$ cat Q6_2 | sed 's;^;s/;' |
 tr ' ' '/' | sed 's;$;/;' | sed -f - Q6_1
所謂いわゆる「死相」というものにだって、
もっと何か表情なり印象なりがあるものだろうに、
人間のからだに駄馬の首でもくっつけたなら、
こんな感じのものになるであろうか、
とにかく、どこという事なく、見る者をして、
ぞっとさせ、いやな気持にさせるのだ。
私はこれまで、こんな不思議な男の顔を見た事が、
やはり、いちども無かった。

Q7

明示的に端末を閉じたりシェルを終わらせるためのコマンド(shutdown, reboot, exit, logout等)以外で端末を閉じてみてください。

解答例

execで何かコマンドを指定すると、シェルのプロセスが終わって端末が閉じます。(他の方法があれば是非。)

ueda@remote:~$ exec echo アホ
アホ
Connection to test.usptomo.com closed.
uedamb:~ ueda$ 

Q8

次のC++のコードに関数プロトタイプをくっつけてください。

ueda@remote:~/GIT/ShellGeiData/vol.22$ cat Q8.cc 
#include <iostream>
#include <string>
using namespace std;

void aho(void)
{
	cout << nazo() << endl;
}

string nazo(void)
{
	return "謎";
}

int main(int argc, char const* argv[])
{
	aho();
	return 0;
}

つまりこういう出力を作ります。

ueda@remote:~/GIT/ShellGeiData/vol.22$ cat Q8.ans.cc 
#include <iostream>
#include <string>
using namespace std;
void aho(void);
string nazo(void);

void aho(void)
{
	cout << nazo() << endl;
}

string nazo(void)
{
	return "謎";
}

int main(int argc, char const* argv[])
{
	aho();
	return 0;
}

解答例

ueda@remote:~/GIT/ShellGeiData/vol.22$ cat Q8.cc | grep ')$' |
 grep -v '^int main' | sed 's/$/;/' |
 awk 'BEGIN{a=0}FILENAME=="-"{a=1}{print a,$0}/using/{a+=2}' Q8.cc - |
 sort -s -k1,1 | sed 's/^..//'

Pocket{var j=d.createElement("script");j.id=i;j.src="https://widgets.getpocket.com/v1/j/btn.js?v=1";var w=d.getElementById(i);d.body.appendChild(j);}}(document,"pocket-btn-js");
LINEで送る

脚注   [ + ]

1. i+1)/2); if(x<(i+1)/2) print (v[x-1]+v[x])/2; else print v[x-1];}'

— Blacknon(エビス) (@blacknon_) 2016年4月30日

Q2

次のような出力から初めて、

ueda@remote:~$ echo カレーライス 醤油ラーメン | ...

次のような出力を得てください(表示がずれてますが、「ー」のところで文字列をクロスさせています)。最初のパイプより右側はマルチバイト文字を使わないようにしてみましょう。「ー」が何文字目にあるか等の情報は何でも使って結構です。

      カ
      レ
醤油ラーメン
      ラ
      イ
      ス

解答

ueda@remote:~$ echo カレーライス 醤油ラーメン |
 awk '{print $2;gsub(/./,"      &\n",$1);print $1}' |
 awk 'NR==1{a=$1}NR!=1{print $1==substr(a,4,1)?a:$0}'
      カ
      レ
醤油ラーメン
      ラ
      イ
      ス

Q3

次のデータについて、

ueda@remote:~/GIT/ShellGeiData/vol.22$ cat Q3
aaabbb
bababa
aaabbb
aaabbb
bababa
bbbbba

次のような出力を得てください。

bababa  2 5
aaabbb  1 3 4
bbbbba  6

次に、得られた答えから元のデータを復元してください。Q3の答えはQ3.ansにあります。

解答

前半はAWKの連想配列のおさらい問題でした。

ueda@remote:~/GIT/ShellGeiData/vol.22$ cat Q3 |
awk '{a[$1]=a[$1]" "NR}END{for(k in a){print k,a[k]}}' 
bababa  2 5
aaabbb  1 3 4
bbbbba  6

復元は次の通り。

ueda@remote:~/GIT/ShellGeiData/vol.22$ cat Q3.ans |
 awk '{for(i=2;i<=NF;i++)print $1,$i}' |
 sort -k2,2n | awk '{print $1}'
aaabbb
bababa
aaabbb
aaabbb
bababa
bbbbba

Q4

次のファイルについて、素数行目に存在するりんごとみかんをそれぞれ数えてください。できる人は素数の行を2,3,5,7と明示的に指定しないでやってみてください。

ueda@remote:~/GIT/ShellGeiData/vol.22$ cat Q4
りんご
りんご
みかん
みかん
りんご
みかん
りんご
りんご

解答

先にfactorを使ってからpasteでQ4ファイルをくっつけると楽です。

ueda@remote:~/GIT/ShellGeiData/vol.22$ seq 1 100 | factor |
 paste - Q4 | awk 'NF==3' | grep -oE '[あ-ん]+' | sort | uniq -c
      1 みかん
      3 りんご

Q5

足して10になる並びを全て見つけてみましょう。

ueda@remote:~/GIT/ShellGeiData/vol.22$ cat Q5
1 3 4 4 2 3 5 6 7 9 1 4

解答

計算量的には損ですが、先に組み合わせを全部列挙すると楽です。ただ、列挙は面倒くさいです。

ueda@remote:~/GIT/ShellGeiData/vol.22$ cat Q5 |
 awk '{for(len=1;len<=NF;len++)for(shift=1;shift<=NF-len+1;shift++)
{for(i=shift;i<shift+len;i++){printf $i" "};print ""}}' |
 awk '{a=0;for(i=1;i<=NF;i++)a+=$i;print $0,a}' | awk '$NF==10'
9 1  10
4 4 2  10
2 3 5  10

Q6

次のファイルQ6_1のX,Y,Zに、

ueda@remote:~/GIT/ShellGeiData/vol.22$ cat Q6_1 
所謂いわゆる「Z」というものにだって、
もっと何か表情なり印象なりがあるものだろうに、
YのからだにXでもくっつけたなら、
こんな感じのものになるであろうか、
とにかく、どこという事なく、見る者をして、
ぞっとさせ、いやな気持にさせるのだ。
私はこれまで、こんな不思議な男の顔を見た事が、
やはり、いちども無かった。

Q6_2に書いてある文字列を当てはめてください。

ueda@remote:~/GIT/ShellGeiData/vol.22$ cat Q6_2
X 駄馬の首
Y 人間
Z 死相

解答

sedでsedのコマンドを作ってsedに食わせます。

ueda@remote:~/GIT/ShellGeiData/vol.22$ cat Q6_2 | sed 's;^;s/;' |
 tr ' ' '/' | sed 's;$;/;' | sed -f - Q6_1
所謂いわゆる「死相」というものにだって、
もっと何か表情なり印象なりがあるものだろうに、
人間のからだに駄馬の首でもくっつけたなら、
こんな感じのものになるであろうか、
とにかく、どこという事なく、見る者をして、
ぞっとさせ、いやな気持にさせるのだ。
私はこれまで、こんな不思議な男の顔を見た事が、
やはり、いちども無かった。

Q7

明示的に端末を閉じたりシェルを終わらせるためのコマンド(shutdown, reboot, exit, logout等)以外で端末を閉じてみてください。

解答例

execで何かコマンドを指定すると、シェルのプロセスが終わって端末が閉じます。(他の方法があれば是非。)

ueda@remote:~$ exec echo アホ
アホ
Connection to test.usptomo.com closed.
uedamb:~ ueda$ 

Q8

次のC++のコードに関数プロトタイプをくっつけてください。

ueda@remote:~/GIT/ShellGeiData/vol.22$ cat Q8.cc 
#include <iostream>
#include <string>
using namespace std;

void aho(void)
{
	cout << nazo() << endl;
}

string nazo(void)
{
	return "謎";
}

int main(int argc, char const* argv[])
{
	aho();
	return 0;
}

つまりこういう出力を作ります。

ueda@remote:~/GIT/ShellGeiData/vol.22$ cat Q8.ans.cc 
#include <iostream>
#include <string>
using namespace std;
void aho(void);
string nazo(void);

void aho(void)
{
	cout << nazo() << endl;
}

string nazo(void)
{
	return "謎";
}

int main(int argc, char const* argv[])
{
	aho();
	return 0;
}

解答例

ueda@remote:~/GIT/ShellGeiData/vol.22$ cat Q8.cc | grep ')$' |
 grep -v '^int main' | sed 's/$/;/' |
 awk 'BEGIN{a=0}FILENAME=="-"{a=1}{print a,$0}/using/{a+=2}' Q8.cc - |
 sort -s -k1,1 | sed 's/^..//'

Pocket