第64回シェル芸勉強会メモ
はじめに 2023年4月22日に開催された第64回シェル芸勉強会にオンラインで参加しました。 そのときの記録をメモとして記事にしておこうと思います。 あと、解けそうな問題はChatGPT(GPT-4)にも解いていただこうと思います。 公式配信 ## 問1 : メール解析 問題内容 メールの内容から必要な情報だけ抜き出します。 私の回答 cat S*/*64/*.txt|sed 's/-/ /g'|sed 's/:/ /g'|sed 's/:>//g'|sed 's/Re //g'|sort -k9|awk '{c[NR]=$3;d[NR]=$4;g[NR]=$7;h[NR]=$8;i[NR]=$9}END{for(j=1;j<length(i);j++){if(i[j]==i[j-1]){printf("%s %s %s %d\n",i[j],g[j-1]"->"h[j-1],g[j]"->"h[j],(c[j]-c[j-1])*24+d[j]-d[j-1])}}}' 私の感想 awkでごり押ししました。 まずsedでメール内容を整形して、時刻を比較したいメール同士が並ぶようにsortで並べ替えを行います。 それからawkでメール内容をすべて配列に入れて、時刻の差分を計算して必要な情報だけ出力しました。 ちなみに、私の回答は不完全なので分と秒を考慮できていません。 まだまだ勉強が足りていない気がしますね。 精進します。 問2 : 乱数生成 問題内容 正規分布に従う乱数を生成します。 私の回答 echo | awk 'BEGIN{srand();a=0}{for(i=0;i<12;i++)a+=rand()}END{printf("%lf\n",a-6)}' 私の感想 私は正規分布が分からないので0~1の乱数を12個足して6を引いた値を出力しました。 解説で紹介されていた「cat /dev/urandom」から乱数を生成する方法が勉強になりました。 これから乱数を生成するときは使ってみようと思います。 数値だけではなくアルファベットの文字列もランダムに生成できるとのこと。 便利ですね。ありがとうございます。 ChatGPT(GPT-4)の回答 awk 'BEGIN {srand(); u1=rand(); u2=rand(); z0=sqrt(-2*log(u1))*cos(2*3.14159265359*u2); print z0}' Box-Muller変換を使っているらしいです。 問3 : 行列の転置 問題内容 与えられた行列が対称行列か判定します。 私の回答 cat S*/*64/mat | python3 -c 'import numpy as np;A=[input().split() for _ in range(5)];A=np.array(A);AT=A.T;r="YES" if np.array_equal(A,AT) else "NO";print(r)' 私の感想 awkで行列を扱うのは地獄になりそうだったのでPythonのNumpyを使って解きました。 解説ではdatamashコマンドが紹介されていて勉強になりました。 まだまだ知らないコマンドがたくさんありますね。 便利なコマンドは少しずつ覚えておきたい所存です。 また、二次元配列の入力に関しては以下の記事を参考にさせていただきました。 ...
