ダウンロード
              (2015年11月20日更新)
2015年11月19日以前にダウンロードされたscript_20150529.zipには収録内容に間違いがありました。申し訳ございません。ご面倒をおかけしますが、最新版となるscript-20151118.zipをダウンロードし直してください。
「script_20150529.zip」版とは「\chap5\sec511」に収録されている「crypto.awk」のみの修正となります。
本書で使用しているサンプルスクリプトとテキストデータがダウンロードできます。ダウンロードしたzipファイルを解凍してご利用ください。サンプルは章ごとのフォルダに分けて収録されています。
書籍掲載ファイル名の左側に記載されている[2]が「chap2」フォルダ、[4]が「chap4」フォルダです。5章については「chap5」フォルダの中に、さらに細かな分類でフォルダ分けをしてあります(例:書籍で[5-1-1]とあるファイルは「sec511」フォルダ内)。利用についての詳細は本書、およびサンプル内のテキストを参照のこと。
  - ダウンロード
 
-  サンプルスクリプト&テキストデータ(script-20151118.zip)
 
免責:本サンプルスクリプトおよびサンプルテキストデータを使用することによって、使用者が受けたあらゆる不利益に対して、原著者および技術評論社はその責任を負いません。
            
            
              補足情報
              P.27 「フィールド」についての補足情報
本文中、区切り文字(フィールドセパレータ)のデフォルトについて言及している個所があります。「1文字以上のスペースまたはタブの連なり(混在も含む)」(下記「お詫びと訂正」も参照ください)とは、正規表現で言うところの
です。
FSにはデフォルトで" "(スペースが1つ)入っているだけなのですが、この場合(FS=" "と再定義した場合でも)なぜか例外的に、フィールドの区切りが正規表現での
のように振る舞います。
試しに、FSにスペース以外の文字(たとえば'a'、もちろんタブ'\t'であっても)を入れると、a“1文字”が区切りとみなされ、
1a1    → NF=2
1aa1   → NF=3
1aa1a1 → NF=4
  
 | 
となります。
では、スペース1文字をフィールドの区切りにしたいときはどうすれば良いかというと、
とスペースを1つ[]で括った形で記述します。
これは、以下のワンライナーで(BEGINでのFSに入れる文字を変えて)確認すると確かめられます。入力は標準入力からになるので、キーボードから適当な行を入力して、改行を入力後に表示されるフィールド数を確認してください(ENDでFSを表示しているのは確認用です)。
gawk 'BEGIN{FS="[ \t]+"} {print NF} END{print "|" FS "|"}'
  
 | 
awkの実行で問題が発生する場合、およびWindows環境についての補足情報
(2015年7月7日更新)
動作結果の異常や、エラーによって処理が中断してしまうような場合、まずは次の点についてご確認ください。
- お使いのgawkが対応している文字コード(本書執筆にあたっては、OS XおよびLinux上で動作するUTF-8に対応しているバイナリを使用いたしました)が適切であるか
 
- お使いのgawkが対応しているスクリプトおよびテキストデータのファイルタイプ(本書執筆にあたっては、Unix形式に対応したもので確認しております)が適切であるか
 
サポートページからダウンロードできるスクリプトおよびデータにつきましても、上記条件に適合したものを提供させていただいております。
また、本書での確認対象外ではありますが、Windows環境で動作するいくつかのバージョンのgawk.exe、たとえば、
- A) gawk 4.0.1
 - 
http://osdn.jp/projects/sfnet_ezwinports/downloads/gawk-4.0.1-w32-bin.zip/
日本語等のマルチバイトを含むスクリプト、データを扱えない 
- B) gawk(mbcs マルチバイト文字セット対応版)3.1.5
 
- http://www.vector.co.jp/soft/dl/win95/util/se376460.html
UTF-8のデータを適切に扱えないようです(対象のデータとスクリプトがShift-JISであれば、動作するケースはあります) 
等では、本書サンプルが適切に動作しないケースを確認しております(2015年7月3日時点)。
お使いのgawkが対応している文字コードやファイルタイプは、gawkの配布時に添付されているドキュメントやWebページ上、“gawk --version”コマンド等で確認できることがあります。gawkをソースコードからコンパイルしてお使いいただいている場合は、ソースコードと一緒に配布されているドキュメントやgawkのbuild時(configure等)のオプション指定をご確認願います。
上記の1.、2.に不適合がある場合は、テキストの文字コードやファイルタイプの変更を試みる、本書執筆時の環境と同様のOS、gawkを試す(参考:1章のコラム)等の対応をしていただけるようお願い致します。
            
            
              お詫びと訂正(正誤表)
              本書の以下の部分に誤りがありました。ここに訂正するとともに、ご迷惑をおかけしたことを深くお詫び申し上げます。
(2016年2月4日更新)
P.27 本文
| 誤 | 
指定しなければ1文字のスペースまたはタブになりますが、
 | 
| 正 | 
指定しなければ1文字以上のスペースまたはタブの連なり(混在も含む)になりますが、
 | 
P.30 実行結果の1行目
| 誤 | 
$ gawk -f beginfile file file2
  
 | 
| 正 | 
$ gawk -f beginfile.awk file file2
  
 | 
P.31 実行結果の1行目
| 誤 | 
$ gawk -f beginfile file file2
  
 | 
| 正 | 
$ gawk -f beginfile2.awk file file2
  
 | 
P.38 OFSの実行例
| 誤 | 
$ awk '{$1 = $1; print $0}' datafile
  
 | 
| 正 | 
$ gawk '{$1 = $1; print $0}' datafile
  
 | 
P.73 傍注†
| 誤 | 
テストはjgawkで行いました。 | 
| 正 | 
テストはgawkで行いました。
 | 
P.104 図3-9 一致列の3行目
| 誤 | 
abcabbdabbe | 
| 正 | 
abcabbdabbe
 | 
P.102 「例」の表中4行目
P.102 「例」の表中5行目
P.142 本文(数式)
| 誤 | 
3×52+4×5-5=(3×5+4)×5-4
 | 
| 正 | 
3×52+4×5-5=(3×5+4)×5-5
 | 
P.187 リスト5-1の下から4行目
| 誤 | 
gsub(substr(lower, k, 1), substr(upper, list[k], k), $0)
  
 | 
| 正 | 
gsub(substr(lower, k, 1), substr(upper, list[k], 1), $0)
  
 | 
P.191 2つめの実行結果の1行目
| 誤 | 
$ gawk -f exch.awk -f con crypto.txt
  
 | 
| 正 | 
$ gawk -f exchange.awk -f - crypto.txt
  
 | 
P.213 実行結果2の1行目
| 誤 | 
$ gawk -f cashbk2.awk note1992
  
 | 
| 正 | 
$ gawk -f cashbk2.awk note.txt
  
 | 
P.214 実行結果3の1行目
| 誤 | 
$ gawk -f cashbk3.awk note1992
  
 | 
| 正 | 
$ gawk -f cashbk3.awk note.txt
  
 | 
P.253 本文
| 誤 | 
END部で、描画している関数名を graph() に固定している、 | 
| 正 | 
BEGIN部で、描画している関数名を graph() に固定している、
 | 
P.254 図5-7 (c)重複組み合わせ 3種2個 6通り
| 誤 | 
0	1	2
--------------------
□	0	00
		11
		22
	1	11
		22
	2	22
  
 | 
| 正 | 
0	1	2
-------------------
□	0	00
		01
		02
	1	11
		12
	2	22
  
 | 
P.272 本文
P.279 実行結果(正規ラベル木からの親子関係の記述)の全面差し替え
| 誤 | 
$ gawk -f tree_struct.awk inp5.txt | sort
/
/ /a /b
/a /a/b /a/c /a/d
/a/b /a/b/b /a/b/c
/a/b/b
/a/b/c /a/b/c/f
/a/b/c/f
/a/c /a/c/a
/a/c/a
/a/d /a/d/e /a/d/f
/a/d/e /a/d/e/a
/a/d/e/a
/a/d/f
/b /b/d
/b/d /b/d/e
/b/d/e /b/d/e/f
/b/d/e/f
  
 | 
| 正 | 
$ gawk -f tree_path.awk -v WH="/" inp5.txt | sort
/  /a /b
/a  /a/b /a/c /a/d
/a/b  /a/b/b /a/b/c
/a/b/b
/a/b/c  /a/b/c/f
/a/b/c/f
/a/c  /a/c/a
/a/c/a
/a/d  /a/d/e /a/d/f
/a/d/e  /a/d/e/a
/a/d/e/a
/a/d/f
/b  /b/d
/b/d  /b/d/e
/b/d/e  /b/d/e/f
/b/d/e/f
  
 | 
P.281 実行結果(有向グラフの隣接行列)の全面差し替え
| 誤 | 
$ awk -f graph_adjacency.awk inp1.txt
  A B C D E F
A 0 1 1 0 0 0
B 0 0 0 1 0 0
C 0 0 0 0 0 1
D 1 0 1 0 0 1
E 1 1 0 0 0 0
F 0 0 0 0 0 0
  
 | 
| 正 | 
$ gawk -f graph_adjacency.awk inp1.txt
  A B C D E F
A 0 1 1 0 0 0
B 0 0 1 1 0 0
C 0 0 0 0 1 0
D 0 0 0 0 0 1
E 0 1 0 1 0 1
F 0 0 0 0 0 0
  
 | 
P.282 実行結果(有向グラフの推移閉包と最短経路数)の1行目
| 誤 | 
awk -f graph_minpath.awk inp1.txt
  
 | 
| 正 | 
gawk -f graph_minpath.awk inp1.txt
  
 | 
P.290 リスト5-35の5行目
| 誤 | 
fname = "PersonAsses.txt"
  
 | 
| 正 | 
fname = "person_asses.txt"
  
 | 
P.297 実行結果(ライフゲーム)の1行目
| 誤 | 
$ gawk -f life.awk life1.txt
  
 | 
| 正 | 
$ gawk -f life.awk life.txt
  
 | 
P.301 実行結果の2行目以降差し替え
| 誤 | 
2 2 2 2 1 1
1 0 1 2 0 0
0 0 1 2 1 1
0 1 1 2 2 2
0 0 0 0 1 2
  
 | 
| 正 | 
2 2 0 0 1 1
1 2 1 0 0 0
2 2 1 0 1 1
2 1 1 2 2 2
2 2 2 2 1 2
  
 | 
P.301 リスト5-38の5行目
P.301 リスト5-38の10行目
P.302 リスト5-38(つづき)の15行目
P.302 リスト5-38(つづき)の23行目
| 誤 | 
 | 
| 正 | 
printf Maze[kx][ky]+0 " "
  
 | 
P.324 データ5-33のファイル名
P.325 実行結果3の1行目
| 誤 | 
$ gawk -f word.awk +41 eng.dat > res.dat
  
 | 
| 正 | 
$ gawk -f word.awk +41 eng.txt > res.txt
  
 | 
P.325 実行結果3の3行目
| 誤 | 
$ gawk -f word.awk +42 res.dat
  
 | 
| 正 | 
$ gawk -f word.awk +42 res.txt
  
 | 
P.338 リスト5-48(つづき)の下から8行目
P.339 リスト5-48(つづき)の9行目
P.339 リスト5-48(つづき)の11行目
| 誤 | 
c = jsubstr(lbuf, jlength(lbuf), 1);
  
 | 
| 正 | 
c = substr(lbuf, length(lbuf), 1);
  
 | 
P.339 リスト5-48(つづき)の13行目
| 誤 | 
lbuf = jsubstr(lbuf, 1, jlength(lbuf) - 1);
  
 | 
| 正 | 
lbuf = substr(lbuf, 1, length(lbuf) - 1);
  
 | 
P.339 リスト5-48(つづき)の14行目
| 誤 | 
c = jsubstr(lbuf, jlength(lbuf), 1);
  
 | 
| 正 | 
c = substr(lbuf, length(lbuf), 1);
  
 | 
P.339 リスト5-48(つづき)の20行目
P.357 1つめの実行結果
| 誤 | 
$ gawk -f ed.awk data1 data2
   : OPEN; text area 1-5 for data1
   : OPEN; text area 6-16  for data2
  1: Hello!                      ← data1の1行目の内容
  
 | 
| 正 | 
$ gawk -f ed.awk eng1.txt eng2.txt
   : OPEN; text area 1-5 for eng1.txt
   : OPEN; text area 6-7 for eng2.txt
  1:         "I AM A CAT"        ← eng1.txtの1行目の内容
  
 | 
P.361 本文
| 誤 | 
:do $1=""; n=jindex($0, ":"); $0=tolower(substr($0, n))
  
 | 
| 正 | 
:do $1=""; n=index($0, ":"); $0=tolower(substr($0, n))
  
 | 
P.362
| 誤 | 
実行例1(awkプログラムを起動させて、エディタ内のテキスト(eng1.txt)全体を編集する)
 | 
| 正 | 
実行結果1(awkプログラムを起動させて、エディタ内のテキスト(eng1.txt)全体を編集する)
 | 
P.362 実行結果1の5~6行目
| 誤 | 
   : CALL; awk -f sentence.awk a:/tmp/awk2 > a:/tmp/awk3
   : DONE; load area 1-5 from a:/tmp/awk3, new area 1-5
  
 | 
| 正 | 
   : CALL; awk -f sentence.awk ./awk2 > ./awk3
   : DONE; load area 1-5 from /awk3, new area 1-5
  
 | 
P.362 傍注††
P.363
| 誤 | 
実行例2(awkプログラム(out.awk)の編集中に適当なサンプルデータを与えて実験する)
 | 
| 正 | 
実行結果2(awkプログラム(out.awk)の編集中に適当なサンプルデータを与えて実験する)
 | 
P.363 実行結果2の7行目
P.363 実行結果2の12行目
| 誤 | 
   : CALL; awk -f fld.awk -f a:/tmp/awk2 jpn.dat
  
 | 
| 正 | 
   : CALL; awk -f fld.awk -f ./awk2 jpn.txt
  
 | 
P.365 1つめの実行結果の1行目
| 誤 | 
$ gawk -f ed.awk eng1.txt eng2.dat
  
 | 
| 正 | 
$ gawk -f ed.awk eng1.txt eng2.txt
  
 | 
P.365 1つめの実行結果の3行目
| 誤 | 
   : OPEN; text area 6-16 for eng2.dat
  
 | 
| 正 | 
   : OPEN; text area 6-7 for eng2.txt
  
 | 
P.366 本文
| 誤 | 
これは、文字数単位の位置目盛になっているので、jindex()、jsubstr() や4.8節の jmatch() によるマッチング情報といっしょに使います。 | 
| 正 | 
文字数単位の位置目盛になっているので、5.7節jfld.awk内の関数str_width()を用いることで、いわゆる全角文字にも対応します。
 | 
P.367 2つめの実行結果の3行目
P.369 1つめの実行結果の4行目
P.369 2つめの実行結果の12行目
P.369 2つめの実行結果の14行目
P.369 2つめの実行結果の16行目
P.369 2つめの実行結果の17行目
P.374 リスト5-55(つづき)ページ最後の行
| 誤 | 
if ( arg == "" ) { wid = length(str) } else { wid = jlength(str) }
  
 | 
| 正 | 
if ( arg == "" ) { wid = length(str) } else { wid = length(str) }
  
 | 
P.375 リスト5-55(つづき)3行目
| 誤 | 
if ( arg == "+" && length(jsubstr(str, i, 1)) == 2 ) {
  
 | 
| 正 | 
if ( arg == "+" && length(substr(str, i, 1)) == 2 ) {
  
 | 
P.398 
P.398 索引追加