先日、若者達につみき書店の組版の前処理はawk(おーく)でやっているという話をしたら「そんな言語聞いたことない」と言われた。
昔、次男の友達が家に遊びに来たとき、黒電話を見て「これ、なに?」と言われたとき以来のショックである。
そういえばその次男にもawkのスクリプトを書くアルバイトをしないかと持ちかけたときにも、「言語の歴史の授業できいたことがあるかも」と言われたっけ。
35年くらい前に中学校に就職したとき、PCを使うのは文書作成と成績処理の場面だった。
文書作成には「文作君」が縦長の画面がよかった。今も売っているのかな?
PCソフトでは、罫線の処理に独自性のあった「ひかり」もよく使った。
「松」も使ったっけ。
ところがそれまで日本電気のPC-9801VM2ではメモリーが足りなくて動かなかったが、京都マイコンクラブがRAMディスクを拡張メモリーとして使えるようにしてくれたんだったか(記憶がもう曖昧)、LaTeXがパソコンで動くようになった。
それ以来「一太郎ver3」を削除して、ワープロソフトとは縁を切った。
成績処理は表計算ソフトとして「mp」とか「ロータス123」とか「鶴」とかあったような記憶があるが、それと前後して awk を使うようになった。
表計算ソフトは履歴が残らないが、awkでテンポラリファイルを全部残していった方がミスが減る。
それからずっと仕事で使うソフトは sed, awk, LaTeX が主で、あとはエディタだ。
今から約10年前、それではオイラの仕事を他の人が再利用するのに不便だということでexcelを使い出した。それでsed とawk の出番はほぼなくなったが、ずっと現役で頑張ってきたソフトだ。
ただawkのgnu版のgawkをの日本語化してjgawkを使っていたが、数年前にとうとう更新されなくなった。
それで今はgawkを使っているが、特に支障はない。
いや本当に便利だから使ってみて欲しい。
例えば、『野村量の詰将棋560』の初出情報だけを引き出したいとしよう。
gawk -e"/発表年月/ {print}" nomura500.tex
これだけだ。さらに余分な部分を削除するスクリプトを書いてパイプでsedを通せば完璧。
次は実際に昔使っていた詰パラの解答を書くためのスクリプト。
たったこれだけの短いスクリプトだけど、結構便利に使っていた。
# # 詰将棋学校の解答書を作成する # # 1995.11.11 Koizumi BEGIN{ while(1){ nen = Input("年を入力してください") tsuki = Input("月を入力してください") ofname = "解答" nen tsuki ".tex" printf("\n%s\n",ofname) if("Y"==Yn("よろしいですか? y/[n]")) break } ##### ヘッダーの出力 ##### printf("\\documentstyle[12pt,b5j]{jarticle}\n") >> ofname printf("\\input{kaitou}\n") >> ofname printf("\\begin{document}\n\n") >> ofname ##### 解答入力 ##### while(1){ gakko=Input("学校名を入力してください") printf("\n\\宛先{%s}{%s}\n\n",tsuki,gakko) >> ofname bango=Input("先頭の番号を入力してください") while(1){ printf("\\解答{%d}\n{\n",bango) >> ofname printf("%s:%d の解答を入力してください :\n",gakko,bango) tesuu = 1 getline itte < "/dev/stdin" itte = Henkan(itte) printf("%d手:%s\n",tesuu,itte) kaito = itte tesuu++ while(1){ getline itte < "/dev/stdin" itte = Henkan(itte) if(itte == "M") break if(itte == "BS") continue printf("%d手:%s\n",tesuu,itte) kaito = kaito " ," itte if(length(kaito)>60){ printf("\t%s\n",kaito) >>ofname kaito = "" } tesuu++ } printf("\t%s 迄 %d 手詰\n}\n{\n",kaito,tesuu-1) >>ofname printf("短評を入力してください。終了は空行。\n") hyou = Input(">") while(hyou != ""){ printf("\t%s\n",hyou) >>ofname hyou = Input(">") } hyoka = Yn("評価を入力してください (1桁)") printf("}{%s}\n\n",hyoka) >>ofname printf("%s は,",gakko) if("Y" == Yn("これで終わりですか? y/[n]")) break bango++ } printf("総評を入力してください。終了は空行。\n") printf("\\総評{\n") >>ofname hyou = Input(">") while(hyou != ""){ printf("\t%s\n",hyou) >>ofname hyou = Input(">") } printf("}\n\\署名") >>ofname if("Y" == Yn("解答は,これで終わりですか? y/[n]")) break printf("\n\\newpage\n") >>ofname } ##### フッター出力 ##### printf("\n\\end{document}\n") >> ofname } ##### 関数 ##### func Yn(msg, ans){ printf("%s :",msg) getline ans < "/dev/stdin" return toupper(substr(ans,1,1)) } func Input(msg, ans){ printf("\n%s : ",msg) getline ans < "/dev/stdin" return ans } func Henkan(itte){ itte=toupper(itte) gsub(/MIGI/,"右",itte) gsub(/HIDARI/,"左",itte) gsub(/FU/,"歩",itte) gsub(/KY/,"香",itte) gsub(/KE/,"桂",itte) gsub(/GI/,"銀",itte) gsub(/KI/,"金",itte) gsub(/HIKU/,"引",itte) gsub(/HI/,"飛",itte) gsub(/KA/,"角",itte) gsub(/OU/,"玉",itte) gsub(/GY/,"玉",itte) gsub(/TO/,"と",itte) gsub(/NG/,"全",itte) gsub(/NK/,"圭",itte) gsub(/NY/,"杏",itte) gsub(/RY/,"龍",itte) gsub(/UM/,"馬",itte) gsub(/NAMA/,"生",itte) gsub(/NARAZU/,"生",itte) gsub(/N/,"成",itte) gsub(/IKU/,"行",itte) gsub(/UE/,"上",itte) gsub(/DA/,"打",itte) gsub(/D/,"同",itte) gsub(/DO/,"同",itte) gsub(/YORI/,"寄",itte) gsub(/YORU/,"寄",itte) gsub(/TYOKU/,"直",itte) gsub(/SUGU/,"直",itte) gsub(/DU/,"直",itte) gsub(/UTU/,"打",itte) gsub(/AI/,"合",itte) return itte }Tweet