2003/10/31 に出題した課題の講評.


課題の再掲

出題された課題自体は, inex 2003/10/31 実技資料, 4.1 課題 を参照して下さい.


課題の解答

レポートの書き方について

レポートの内容以前に, 表題や体裁の面で今一つなレポートが未だ多く見受けられます. 加筆修正は何時でも可能ですから, 是非改訂して下さい.

また, 表題は修正不可能ですけれども, レポートの書き直しは可能です. この場合には, 成績評価にどのレポートを用いれば良いかがわかるよう, 一度提出したレポートの文頭に,

を明記して下さい. ただし, 古いレポート自体は削除しないように!!

出題者の意図する所

今回の課題の目的は大まかに言えば, 次の二つです.

  1. 「スクリプト」とはどのようなものかを理解すること.
  2. スクリプトの作成を通して, vi を使ってみること.

上記 1 項目に関しては, レポートを提出している殆どの人が達成できていると思います.

2 項目に関しては, 残念ながら確認のしようがないのでなんとも言えません. vi を使用してレポート作成をして下さったことを願います.

解答

今回の課題自体に対する答はとても簡単です. 例えば ユーザ hogehoge さんが joho49 で作業をしていて, 結果を kadai2-answer.txt へ出力する場合のスクリプトは

#!/bin/bash
cp /home/uwabami/inex2003-kadai2/joho49*.txt /home/hogehoge/
cat joho49*.txt >> kadai2-answer.txt

となります.

さて, レポートを提出している人の約半数は,

最初の cp は不要では…?

と思ったのではないでしょうか.

実はファイルを結合することだけを目的とするならば全くもって不要です. ですがそれではスクリプトっぽくならないと出題者は考え, 課題に

計算機自身の hostname に合致するファイルを カレントディレクトリにコピーし,

を追加しました.

と言うわけで, cat を用いて一行でスクリプトを作成した方は問題をちゃんと読 んでいないので不正解です. 残念.


発展

汎用性

レポートの多くはスクリプトの冒頭に

#!/bin/bash

と宣言しています. これでは bash の置き場が /bin/ で無い場合, 動きません.

この場合の回避策として, env を使用してみては如何でしょう.

#!/usr/bin/env bash

と宣言することで, env の出力した PATH から bash を捜して実行することになります.

情報実験機の番号を標準入力から読み取らせて, 実行する, なんてのもオシャレですね. その場合には例えば

cat joho${1}*.txt > result.txt

ですかね.

出力結果の整形

cat などを用いて結合しただけでは,

という残念なファイルが作成されるでしょう. そんなわけで, 編集記号を削除して適当に改行するにはどうすれば良いでしょうか.

以下のレポートでは編集記号の削除に cut を活用しています. ですが, 改行に関しては未解決のままです.

出題者は sed の利用を提案します. 実際に sed を用いて編集記号を削除しているレポートとしては

でしょうか. しかし残念ながらこちらも改行については未解決のままです.

実は sed で改行を挿入することも可能です. 例えば, 01: 02: で改行を挿入したい場合には

sed -e 's/..:/\
/g' input.txt > output.txt

こんな感じですかね.

整形の仕方は一通りでは無い(著者名の扱いが面倒?)ので, 解答例は述べません. もうちょっと試行錯誤してみて下さい.


佐々木 洋平 (uwabami@ep.sci.hokudai.ac.jp)