ITPASS 実習レポート

名前 卯川 知希

担当情報実験機 joho04

問 1

スクリプトの URL

quiz1.sh.txt

スクリプトの使い方の解説

-準備-

任意の場所に空のディレクトリを作成し、ITPASSサーバ上に置かれた気象データの圧縮ファイル(kadai1_data.tar.gz)を、そのディレクトリ内にコピーして展開する。
展開後、「kadai1_data」という名前のディレクトリが新しく作成されるので、上に示したテキストファイル(quiz1.sh.txt)を、kadai1_dataの中にコピーする。
その後、.txtを削除してファイル名を「quiz1.sh」に改めてから、chmodコマンドで実行権限を与え、シェルスクリプトとして有効化する。

kadai1_data.tar.gzの置き場所 /home/itpass/dc-arch/exp/fy2018/180807/practice_kadai/kadai1_data.tar.gz

-実行-

「./quiz1.sh」と端末上で入力すると、その年最初の夏日が早かった順にランキングが表示される。
月日が一致した場合は、その日の平均気温が高かった方を上位としている。

実行結果へのリンク

問題1の実行結果

参考資料

「シェルスクリプトの中でjoin()とsplit()相当の事をやる」作成者:@piroor(Qiita)

https://qiita.com/piroor/items/55ff672cb9f8e375e659

下のリンクも含めて、年月日、最高気温、平均気温の3要素が存在する行(列)番号を調達する上で助けとなった。

「フィルタを使用した文字列操作 2」作成者:SUNONE

https://shellscript.sunone.me/filter_etc.html

場面場面に応じた文字列の抽出方法を学んだ。

「sort コマンド | コマンドの使い方(Linux) | hydroculのメモ」作成者:hydrocul

https://hydrocul.github.io/wiki/commands/sort.html

数値としてsortがなされず困っていた時に参考にした。

「引数でawkに値を渡す方法:-vオプションを使う | ITを使っていこう」作成者:不明

https://it-ojisan.tokyo/awk-v/

3要素の列だけを元データから抜き出そうとして中々上手くいかなかったが、このページの記述が突破口となった。

工夫したこと, 感想

課題を解く流れを考える中で、ファイルの数だけ同様の処理を繰り返す過程を踏む必要性を感じていたが、最初は適切なfor文の書き方を見出す事が出来なかった。しかし、クォーテーションの使い分け方を学びながら試行錯誤を繰り返して、最終的には、同様の書式で書かれたcsvファイルにまで処理対象を広げることができた。スクリプトの実行から出力までは1秒程度であったので、対象年数をもう少し増やしても対応は可能ではないかと思われる。

一番の難所だったのは、日付、最高気温、平均気温の列を抜き出す所である。awkで抜き出したい列が変数となっているケースはこれまで経験がなく、実現可能かよく分からないままに試す過程はとても不安であった。しかし、望む結果通りに出力された時の達成感はとても大きく、同時に、コマンドを使えば色んな事が出来るのだと、ターミナルでの操作に前向きな印象を持つことが出来た。

問 2

スクリプトの URL

quiz2.sh.txt

スクリプトの使い方の解説

-準備-

まず、任意の場所に空のディレクトリを作り、ITPASSサーバ上にある圧縮ファイル(kadai2_data.tar.gz)を、ディレクトリ内にコピーし、展開する。
展開後、新しく「kadai2_data」というディレクトリが作成されるので、上のテキストファイル(quiz2.sh.txt)を、kadai2_data内にコピーする。
その後、シェルスクリプトとして利用できるように、テキストファイルの名前を「quiz2.sh」に変更して、chmodコマンドで実行権限を与える。
シェルスクリプトの書き換えを行いたい場合は、適宜chmodコマンドで書込の権限を与えるようにする。

kadai2_data.tar.gzの置き場所 /home/itpass/dc-arch/exp/fy2018/180807/practice_kadai/kadai2_data.tar.gz

-実行-

端末上で「./quiz2.sh」と入力すると、大文字・ローマ字表記で都道府県名の入力を求められる。
場所の入力にあたり、HOKKAIDOのように、長音が混ざっている場合は注意が必要である。(HOKKAIDOUではエラーが出て認識されないようになっている)
都道府県を入力した後は、同様に市区町村を入力する。「〜市〜区」の場所を入力する際は、「〜SHI〜KU」のように、間は空けないようにする。
市区町村が正しく入力されると、その場所の光害指数と共に、周辺100 km以内の光害指数が低い地点が昇順で表示される。

実行結果へのリンク

問題2の実行結果(一例)

参考資料

問題1で挙げた参考資料に加えて、以下のものも参考にした。

「データファイル処理に便利なUNIXコマンド」作成者:野口克行(奈良女子大学理学部)

http://www.e.ics.nara-wu.ac.jp/~nogu/tips/unix_command.html

awkで条件を満たす行だけを出力したい時などに活用した。

「AWK - awk のパターンに動的な変数を用いる書き方(60982)|teratail」(質問サイト)

https://teratail.com/questions/60982

コメント行を除いて上から11行目の処理が適切に実行されない現象に悩まされたが、ページ内の書き方で試したところ、問題を解決する事が出来た。

工夫したこと, 感想

光害指数が低い順に並べ替えたものをhead で切り出すという手法をとったので、下から11行目の「head -n 3」の数字を変えれば、10箇所や20箇所に増やすことも可能である。光害指数がもっと低い地点を見てみたい場合は、同行の「'$3 <= 100{print}'」の100をより大きな数字にすると、対象範囲を広げる事が出来る。

シェルスクリプトの骨組みは問題1より短い時間で出来上がったものの、同一名称の市町村に対応出来ていなかったり、HOKKAIDOUでもエラーを出さずに次ステップに移動してしまい、結果として最終的な出力が変になってしまったりと、不具合の修正に苦労した。前者は入力都道府県と完全に一致する行だけを抜き出し、後者はgrepに -xオプションを付加する事で解消したが、提示された「実行結果の例」通りに出力させようとすると正しく表示されない不具合もあって、これは最後まで解消できなかった。列の順番を気にしなければ表示は崩れなかったので、地名と光害指数の順番が逆転しているが、これを完成形とした。