例えばうちの大学の情報電子工学科の計算機実習では 主に C 言語の実習のみを行っているようですが、 コンピュータ言語は世の中には色々あり、 私も C は使いますが、 普段最も書いているプログラムはむしろ「スクリプト言語」です。 スクリプト言語とは「軽いインタプリタ言語」のような意味で、 通常短いプログラムファイル (これをスクリプトと呼びます) をスクリプトの実行プログラムに渡して処理させる、 といった形式で実行するようなもので、スクリプト言語もたくさんあります。 例えば以下のようなものがあります。
私が一番使っているのは多分シェルスクリプトと AWK です。 Unix 用が少ないようですが、 元々 Unix 用のものだったものが MS-Windows にも移植されているものが 沢山あります。
スクリプトのいい点は、C よりも手軽なことで、 C よりも短いプログラムで多くのことができます。 スクリプト言語を知っていると、 色々な定型作業を、C でわざわざプログラムを書かなくても、 楽に行うことができます。
よって多くの人にそれらを知ってもらうために、 まず簡単な入門書を少しずつ書いて公開してみることにしました。
また、入門書を書いてくれる人、 特に私は MS-Windows は使いませんので、 MS-Windows 用のスクリプトの入門書を書いてくれる人を募集しますので、 書いてもいいよという学内の人は、私 (shige@iee.niit.ac.jp) 宛にメールでご連絡下さい。 よろしくお願いいたします。
AWK (通常「おーく」と読まれるようです) は、
私が最もよく利用するスクリプト言語です。
C 言語によく似た構文で構文で書け、
行単位のフィルタとしても、独立したインタプリタとしても利用できます。
(04/05 2006)
C 言語を少し知っている人向けに、AWK の概略をまとめたものです。 これだけで AWK を書くのは難しいでしょうが、 この後に続く文書のための「まとめ」のようなものとして作成しました (04/05 2006 作成、12/14 2007 改訂)。
HTML 版に、PDF ファイルへのリンクを追加しました (01/15 2009)。
AWK プログラミングのサンプルの一つとして、 簡単なタイプ練習ソフトの作成を行いました。 プログラムを作るときの考え方や、外部変数と局所変数、 乱数の使い方など、C 言語でも役立つような話も含まれています。
HTML 版に、PDF ファイルへのリンクを追加しました (01/15 2009)。
タイプ練習ソフトとほぼ構造が同じなので あまりおもしろくないかもしれませんが、 AWK プログラミングのサンプルの一つとして上げておきます。
HTML 版に、PDF ファイルへのリンクを追加しました (01/15 2009)。
WWW ページの中には、情報以外に広告や画像、リンクボタンなど、 見たい情報以外のものが画面のある割合を占めていて、 見たい情報を読んでいくのに邪魔になることがあります。
最近は、そういうものを自分で排除できるような仕組みを ブラウザ自体に持たせることができたりもするようですが、 私は直接その HTML ファイルを持ってきて、 それを AWK で加工して見たり印刷したりしています。 まさにそのような場面で AWK は活躍しますので、 その手法を紹介します
なお、ここで紹介するスクリプトは 手元に保存した HTML ファイルを加工するのですが、 保存するブラウザによっては HTML ファイルを少し加工するものがあるので、 このスクリプトではうまく処理できない場合があります。
(09/08 2006: 追記 shige)
ここに書いた「必要な部分文字列の取得」ですが、
この中では getline を使ってやっているんですが、
よく考えてみたら
/<title>/,/<\/title>/{...}
のようにやる方が楽なことに気がつきました。
そのうちに書き直すかもしれません。
(01/09 2007: 追記 shige)
注:
ここで扱っている Yahoo ニュースの HTML ファイルのフォーマットは
変更されてしまったようなので、
現在は、ここで紹介しているスクリプトは修正しなければ
正しい処理をしてくれません。
HTML 版に、PDF ファイルへのリンクを追加しました (01/15 2009)。
「AWK による HTML ファイルの整形」 では、 Yahoo! ニュースの記事を例にとり、 その必要な情報のみを取り出すための AWK の使い方を紹介しました。 今回は、そこでもアナウンスしたように、 Yahoo! ニュースの記事の一覧を、 不要な部分を取り除いて一つの HTML ファイルに連結する方法について紹介します。 複数のデータファイルを一度に処理する例にもなっています。
なお、ここで紹介するスクリプトは 手元に保存した HTML ファイルを加工するのですが、 保存するブラウザによっては HTML ファイルを少し加工するものがあるので、 このスクリプトではうまく処理できない場合があります。
(09/08 2006: 追記 shige)
ここに書いた「一覧部分の取得」ですが、
この中では getline を使ってやっているんですが、
よく考えてみたら
/<ul>/,/<\/ul>/{...}
のようにやる方が楽なことに気がつきました。
そのうちに書き直すかもしれません。
(09/28 2006: 追記 shige)
スクリプトのバグを見つけました。
##### 各行の取得 ##### ($0 ~ /<ul>/){ sub(/<ul>/,""); if($0 !~ /<li>/) getline; do{ # (1) 1 行を複数の <li> 行に分割して配列に保存 N=divideline($0,h,N); getline; }while($0 !~ /<\/ul>/);の do{ }while ループは、 一覧の最終ページの項目数が少ないと無限ループになる可能性がありますので、 以下のように while{ } ループに書き直す必要があります。
##### 各行の取得 ##### ($0 ~ /<ul>/){ sub(/<ul>/,""); if($0 !~ /<li>/) getline; while($0 !~ /<\/ul>/){ # (1) 1 行を複数の <li> 行に分割して配列に保存 N=divideline($0,h,N); getline; }そのうちに書き直すかもしれません。
(09/29 2006: 追記 shige)
MS-Windows 上でこれを使う場合は、
漢字コードに関する問題があります。
詳しくは、「AWK によるシェル作業」
の 8 節をご覧下さい。
(01/09 2007: 追記 shige)
注:
ここで扱っている Yahoo ニュースの HTML ファイルのフォーマットは
変更されてしまったようなので、
現在は、ここで紹介しているスクリプトは修正しなければ
正しい処理をしてくれません。
HTML 版に、PDF ファイルへのリンクを追加しました (01/15 2009)。
「AWK による HTML ファイルの整形 その 2」 では、 複数の HTML ファイルに分割されている Yahoo! ニュースの記事の一覧を、 一つの HTML ファイルに結合するスクリプトの作成を例にとり、 複数のデータファイルの処理について紹介しました。 今回は、そこでもアナウンスしたように、 さらにその HTML ファイルを加工しジャンル別に分類したものを作成します。 そして、AWK スクリプトの分割 (ライブラリ化) や、 2 重配列の利用法などについて紹介したいと思います。
(09/29 2006: 追記 shige)
MS-Windows 上でこれを使う場合は、
漢字コードに関する問題があります。
詳しくは、「AWK によるシェル作業」
の 8 節をご覧下さい。
(01/09 2007: 追記 shige)
注:
ここで扱っている Yahoo ニュースの HTML ファイルのフォーマットは
変更されてしまったようなので、
現在は、ここで紹介しているスクリプトは修正しなければ
正しい処理をしてくれません。
HTML 版に、PDF ファイルへのリンクを追加しました (01/15 2009)。
「AWK による HTML ファイルの整形 その 2」, 「AWK による HTML ファイルの整形 その 3」 では、 複数の HTML ファイルに分割されている Yahoo! ニュースの記事の一覧を 加工するような例を紹介してきましたが、 その複数の HTML ファイルを取得する際は 私は普段シェルスクリプトを使っています。 しかしそれは MS-Windows 上では使えません。
考えてみれば、AWK には system() という関数があるので、 簡単なシェル作業であれば AWK 上でも行うことができます。 よって今回は、その HTML ファイルの取得からその加工の作業までの シェル作業を、MS-Windows、Unix どちらでも使えるように考えて それを AWK で行う方法について紹介します。 通常このような目的には Perl が使われることが多いと思いますが、 AWK は軽いですし、インストールも楽なので、 それなりにメリットはあるのではないかと思います。
また、ついでに 「AWK による HTML ファイルの整形 その 2」, 「AWK による HTML ファイルの整形 その 3」 のスクリプトも含めてこの仕組みを MS-Windows で動作させる場合の 問題点についても紹介したいと思います。
(01/09 2007: 追記 shige)
注:
ここで扱っている Yahoo ニュースの HTML ファイルのフォーマットは
変更されてしまったようなので、
現在は、ここで紹介しているスクリプトは修正しなければ
正しい処理をしてくれません。
HTML 版に、PDF ファイルへのリンクを追加しました (01/15 2009)。
「アナグラム」というのは、文字列の文字を並び変えて別な言葉を作る、 という遊びですが、短い文字列ならともかく、 長い文字列だと手で書き上げるのは大変です。 かなり長い文字列だとコンピュータでも大変なのですが、 適当な長さの文字列のアナグラムを AWK で作成してみます (予定)。
C 言語で、自分で関数を作成して書く場合、 そのソースの先頭、あるいは別のヘッダーファイルとして その関数のプロトタイプ宣言を書く必要があります。 手で書く代わりに、そのソースから関数定義の先頭部分を読みだして、 自動的にプロトタイプ宣言を作成するツールを作成します。
HTML 版に、PDF ファイルへのリンクを追加しました (01/15 2009)。
非実用的なスクリプトを一つ紹介します。 先日柿の種を食べていたら、その包装紙に豆知識として、 以下のようなことが書いてありました (原文の通りではありません)。
「トランプの各スート (クラブ、ダイヤ、ハート、スペード) は、 四季の春、夏、秋、冬に対応し、トランプのカードの枚数 52 枚は、 1 年の 52 週に対応する。 トランプの数の合計 4×(1+2+…+13)=364 にジョーカーを加えれば 1 年の日数に対応する。ジョーカー 2 枚を使えばうるう年にも対応する」最後のは偶然そうなったのを無理矢理そうしているようにも見えますが、 これを見て、そうだとしたら、トランプのカードの数の和で すべての日が表現できるはず、と気がつきました。 しかも、各スートが四季に対応するなら、例えばクラブのカードだけで、 春の 3 月、4 月、5 月のすべての日を表現し、 しかも 3 月の 31 日を表現したカードを一旦固定して、 それを使わずに 4 月の日付を表現し、 さらに 4 月 30 日の日付を表現したカードを一旦固定して、 5 月のすべての日付を表現できるのでは、と思いました。 つまり、こんな感じです。
このようにして、前の月で使ったカードは使わずに、 丁度クラブだけ + ジョーカー 1 枚で春の 3 ヶ月の日付が全部表現できます。
各季節の 3 ヶ月目に何を残すかが重要なわけですが、 各月でどのカードを使うかさえ決めてしまえば、 あとは機械的に計算できます。 それを awk スクリプトでやってみたのが以下のものです。
ただ、AWK らしい部分はあまりなく、 C のインタプリタ程度としてしか使っていません。 あえて言えば、split() を使って配列の代入をしているところと、 ジョーカーのところだけ配列の添字を文字列にしているところが AWK らしいところでしょうか。
なお絵札は、季節の最初の月に 11 (J)、次の月に 12 (Q)、最後の月に 13 (K) を使うようにしています。
また、冬は 12 月, 1 月, 2 月の順に作っていますが、
カードの組み合わせを変えれば、1 月から始まるようにできないこともないです。
ただし、そうするとうるう年かそうでないかで
カードの組み合わせを変える必要もあります。
(02/20 2017)
上記、およびスクリプトで、季節とスートの関係が違っていましたので、 修正しました。(04/015 2020: shige)
私は行列や行列式の講義も受けもっていますが、 そのテストの採点の際、 正解なら正解と照合するだけでいいわけですが、 誤答の場合どこで間違えているのかを確認するために、 行列の積、逆行列、行列式の計算を頻繁に行う必要があります。 その場合、手でそれを全部やっていると面倒なので、 簡単な行列計算をやってくれる AWK のスクリプトを利用しています。 それをここで紹介したいと思います。 (予定)。
以前、ある問題のために多倍長演算をやる必要性が生じたのですが、 普通なら C で書くのでしょうが、 頻繁にテストやデバッグをしながら作っていかないといけないだろうな、 と感じたことと、 汎用ライブラリの作成ではなくてその問題のための専用の計算でよい、 と感じたのでそれを AWK で書きました。 あまり AWK 向きではないでしょうが、一応紹介したいと思います。 (予定)。
シェルスクリプトは、Unix 上のバッチ処理用のスクリプトで、 ターミナル上で実行するコマンドラインを並べて書くことで、 それを順次実行してくれます。
しかも、単に並べて書くだけではなくて、 条件分岐やジャンプ、ループなどの簡単な制御構文もありますので、 複雑な処理もシンプルに書けますし、 インストールされているいくつかの小さなコマンドを組み合わせて 新たなコマンドを作成でき、十分実用的な面もあります。
通常シェルスクリプト、シェルプログラミングというと B-sh (sh, bash など)
のシェルスクリプトの話であることが多いのですが、
私が普段 tcsh を利用していて、通常 csh スクリプトを書いていることもあり、
ここでは主に csh スクリプトを紹介します。
(01/13 2008)
C 言語を少し知っている向けに csh スクリプトの概要をまとめたものです。 これだけで csh スクリプトを書くのは難しいかもしれませんが、 この後に続く文書のための「まとめ」のようなものとして作成しました (01/13 2008 作成)。
HTML 版に、PDF ファイルへのリンクを追加しました (01/15 2009)。
定期的によく参照する WWW ページをまとめて取得する csh スクリプトを題材に、 csh スクリプトの構文、変数の使い方、 コマンドラインオプションの簡単な検査方法を紹介します。
なお、以前はソースのインデントに全角スペースを使用していましたが、 今は に変えました。 これで多分 HTML 形式の WWW ページをそのままカット & ペーストして 使用できるかと思います。 (01/16 2008 作成; 01/18 2008, 01/22 2008 修正)
HTML 版に、PDF ファイルへのリンクを追加しました (01/15 2009)。
「WWW ページの一括取得 csh スクリプト」 では、よく参照する WWW ページをまとめて取得する csh スクリプトを紹介しましたが、それで取得した WWW ページを、 その前に持ってきてあったものと比較することで更新されているかどうかを調べ、 更新されているもののみをブラウザで開く、 ということを行う csh スクリプトを紹介します。
それを題材として、ここでは、
ファイル検査式や少し複雑なリスト変数の使い方、
mv や一時ファイルの扱い、
AWK との組み合わせによるデータ処理などを紹介します。
(01/24 2008 作成)
HTML 版に、PDF ファイルへのリンクを追加しました (01/15 2009)。
バッチファイルは、MS-DOS の頃からバッチ処理を行う環境として、 現在の MS-Windows にも「コマンドプロンプト」として残されているものです。 MS-DOS の頃からは多少機能が拡張されているので、 それなりに使えなくもないですし、 長い間使われているので、それなりに安定もしています。
MS-Windows 上の GUI アプリケーションは、基本的に対話型ですし、 使用するファイルも専用バイナリ形式なので、 あまりバッチ処理には向かないかもしれませんが、 それなりに実用性もありますし、 日常的な小さなプログラムを書くには、 それなりにいい環境ではないかと思います。バッチファイルの概要を簡単にまとめたものですが、 あまり基礎知識を仮定しなかったことと、 基本コマンドの説明も入れてしまったためだいぶ長くなってしまいました。 サンプルはあまり含まれていませんので、 これだけでバッチファイルを書くのはちょっと難しいかもしれませんが、 この後に続く文書のための「まとめ」 として使えるのではないかと思います (07/02 2010 作成)。
誤植等、数カ所を修正しました。(05/02 2011: shige)
「echo.」「echo.on」「環境変数の部分文字列」 「setlocal enabledelayedexpansion」などの内容の追加、修正を行いました。 (06/20 2013: shige; 07/12 2013: 誤植の修正: shige)
if 文の文字列比較の部分、および else if の部分を修正しました。 (05/02 2014: shige)
備忘録もかねて、有用なリンク等をここに置きます。