rem progsort.bat rem フリコレの作品名をソート [keyword]パターン付き rem 必要なもの ()内は置き換え可 rem (jg)awk.exe sed.exe sort.awk(sort.exe) rem lha.exe fswidx.lzh : [5-9].idx(helper.idx を リネームしてフリーズ) rem usage : progsort file -- 必要ファイルの分離のみ rem progsort init [idx].. -- keyw.cfg を 消して再作成 rem progsort - [idx].. -- keyw.cfg にもとづいて作成 rem [idx].. -- 5,6 7 のように spase または ',' で分けて記述 rem 記述無ければ 5-9 が 対象 rem sort.awk がないときには、 set sort=sort などのように設定 if "%1" == "" goto pshelp if "%1" == "file" goto progsortend : 内蔵ファイルを カレントデレクトリに展開 awk "/^#f /{f=$2;next} /^$/{f=0} f{print>f}" %0.bat if exist sort.awk set sort=awk -f sort.awk if not "%sort%" == "" goto sc rem ソートできません goto progsortend :sc if exist progsort.txt del progsort.txt if "%1" == "init" del keyw.cfg set idx=%2 :loop shift if "%2" == "" goto start set idx=%idx%,%2 goto loop :start rem ディフォルトの 対象となる ファイルを書き込む if "%idx%" == "" set idx=5,6,7,8,9 if exist keyw.cfg goto s for %%x in (%idx%) do c:command /c keyw %%x : type keyw.txt awk -f keyw.awk keyw.txt > keyw.cfg del keyw.txt type keyw.cfg : pause :s for %%x in (%idx%) do c:command /c pidx %%x : awk -f keyco.awk -f pidx.awk *.idx > progsort.txt : ドライブに余裕があれば [5-9].idx を カレントディレクトリにおいて : 上の行と置き換え %sort% < progsort.txt > p awk -f nfch.awk p > progsort.txt : awk "{printf\"%%1.1s %%4d\",$NF,$(NF-1);for(i=1;i<(NF-1);i++)printf\" %%s\",$i;print\"\" }" p > progsort.txt : nfch.awk と同等 del p. awk '{l[$NF]++}END{for(i in l)print i,l[i]}' progsort.txt | awk -f keyco.awk -f keydeprt.awk > keywpat.txt goto progsortend --- ここから 必要ファイル #f keyw.bat if not exist %1.idx lha e fswidx %1.idx sed '1i#%1;s/^KEYWORD: +/# /;s/ +$//;/^$/q' %1.idx >> keyw.txt : awk 'BEGIN{ print "#"%1} {sub(/^KEYWORD: +/,"# ");sub(/ *$/,"");print $0} /^$/{exit}' %1.idx >> keyw.txt : 上の行と同じ sed.exe が いらない if exist fswidx.lzh del %1.idx #f pidx.bat if not exist %1.idx lha e fswidx %1.idx awk -f keyco.awk -f pidx.awk %1.idx >> progsort.txt if exist fswidx.lzh del %1.idx #f m.bat :start if not "%1" == "%r%" goto sr echo FSW: %1 %2>> midx.txt sed -n '%2,/^$/p' %1.idx >> midx.txt shift shift if "%1" == "" goto end goto start :sr if not exist fswidx.lzh goto ss if exist %r%.idx del %r%.idx lha e fswidx %1.idx :ss set r=%1 goto start :end if exist fswidx.lzh del %r%.idx set r= type midx.txt #f search.bat echo off if "%1" == "v" set v=1 : vi keyw.cfg awk -v v=%v% -f keyco.awk -f ksearch.awk progsort.txt > search.txt echo cursol on [0v : miel -g search.txt type search.txt #f keyw.awk { print } /^# /{ c = split($0,m," +") for( j = 2 ; j <= c ; j++ ){ if( m[j] in b ) ; else{ b[ a[++i] = m[j] ] } } } END{ for( j = 1 ; j <= i ; j++) print a[j] } #f pidx.awk FNR == 1 ,/^$/{ next } /^PRO/{ sub(/^PROGRAM *: +/,"") p = $0 l = FNR } #/^KEY/ && /ツール/ && /データ/ && /TOWNS-OS/{ # 最初から こうしておけば 処理は速いだろうな /^KEY/{ for( j = 2 ; j <= NF ; j++ ){ k[$j] } } #/^MAK/{ # sub(/^MAKE *: +/,"") # m = $0 #} /^$/ && p != "" { put() } END{ if( p != "" ){ put() } } function put( j,f ){ f = "" for( j = 1 ; j <= kmax ; j++ ){ f = ( ( ak[j] in k ) ? "1" : "0" ) f } # print p,m,kco(f),l,FILENAME print p,kco(f),l,FILENAME p = "" for( j in k ) delete k[j] } #f keyco.awk BEGIN{ while( ( getline l < "keyw.cfg" ) > 0 ){ if( l ~/^#/ || l ~/^$/ ) continue split(l,k,"[ \t]+") ak[++kmax] = k[1] as[ kmax] = k[2] } for( l in k ) delete k[l] nn = 7 # bit 数 l = 48 + 64 # 6 bit - 64 : 7 bit - 128 l = 224 # '0' 以降の 全ての半角文字 for( j = 48 ; j < l ; j++ ){ if( 127 <= j && j < 161 ) continue ss = ss sprintf("%c",j) } # print ss } function kco( b ,a,i,r ){ # 2 進数文字列 --> $code sub(/^0*/,"",b) while( ( length(b) % nn ) != 0 ) b = "0" b r = "" a = 0 for( i = 1 ; i <= length(b) ; i++ ){ a = a * 2 + substr(b,i,1) if( ( i % nn ) == 0 ){ r = r substr(ss,a+1,1) a = 0 } } sub(/^0+/,"",r) return ( "$" r ) } function kde( o ,r,i,j,a ){ # $code --> 2 進数文字列 if( substr(o,1,1) != "$" ) return "err" r = "" for( i = length(o) ; i >= 2 ; i-- ){ a = index(ss,substr(o,i,1)) - 1 if( a < 0 ) return "err" for( j = 0 ; j < nn ; j++ ){ r = ( ( a % 2 ) == 0 ? "0" : "1" ) r a = int( a / 2 ) } } return r } #f keydeprt.awk # awk -f keyco.awk -f keydeprt.awk [file] # echo $code | awk -f keyco.awk -f keydeprt.awk # [keyword] パターン $code を 展開表示 { if( $2 ~/[0-9]/ ){ printf "%-6s%4d : ", $1, $2 }else{ printf "%-6s : ", $1 } f = kde($1) for( i = 1 ; i <= length(f) ; i++ ){ if( substr(f,length(f)-i+1,1) == "1" ) printf "%-11s",ak[i] } print "" } #f ksearch.awk # awk [-v v=1] -f keyco.awk -f ksearch.awk [file|progsort.txt] # ちょっと(...だいぶん)時間がかかるので覚悟 BEGIN{ for( i in as ) if( as[i] == "*" ) b++ usesc["-"] = 1 # not 選択 : red usesc["+"] = 3 # or 選択 : yellow usesc["*"] = 6 # and 選択 : skyblue usesc[""] = 4 # nop : blue v += 0 cr[0] = "@" cr[1] = "\n" printf "\33[1v" > "con" # cursol off } { f = kde($NF) c = d = 0 for( i = 1 ; i <= length(f) ; i++ ){ if( substr(f,length(f)-i+1,1) != "1" ) continue if( v ) printf "\33[3%dm[%s]\33[m", usesc[as[i]],ak[i] > "con" if( as[i] == "-" ){ printf cr[v] > "con" next } if( as[i] == "*" ) c++ if( as[i] == "+" ) d++ } printf cr[v] > "con" if( b != 0 && b == c || d != 0 ) print } END{ printf "\a\33[0v" > "con" # cursol on & bell } #f nfch.awk { printf "%1.1s %4d",$NF,$(NF-1) for( i = 1 ; i < (NF-1) ; i++ ){ printf " %s",$i } print "" } --- ここまで note : ◇progsort.bat progsort.txt keyw.cfg keywpat.txt の作成と関連ファイルの分離だけの ものです。本体は、とても小さいです。 カレントディレクトリに置かなくても、フルパスで呼び出せば、十分です。 作品名だけの場合なら、 awk '/^PROG/{f=FILENAME;printf"%1.1s %4d %s\n",f,FNR,$0}' *.idx で、すんでしまうのに・・・ ◇[keyword]パターン $code について キーワードの設定を2進化し、128進数表現で、表らわしています。 コード・デコードともに keyw.cfgを使用しています。progsort.txtと一 緒に作成されたもので、 keyw.cfgのキーワードの順序と数が、変更された ときは、正しく変換されません。 echo $code | awk -f keywco.awk -f keywdeprt.txt などで、表示できます。 ◇search.bat [v] キーワードでの作品の絞り込みができます。 keyw.cfg のキーワードの後ろに、スペースまたはタブで、区切って次の 文字を書き込みます。'#' で始まる行と空行は、無視されます。 + : or 選択 設定されていれば、選択されます。 * : and 選択 設定の数と '*' の数が一致すると選択されます。 - : not 選択 '*','+' にかかわらず選択されません。 時間はかかりますが、かなり複雑な条件もできます。 search.txt に結果が返ります。 v オプションで検索途中のキーワードがみれます。 ◇m.bat [idx],[line] .. progsort.txt,search.txt の行頭にあるのが、vol no. 次が、helper.idx での行数です。 m 5,222 7,3333 8,222 9,1022 などのようにすれば、それぞれの情報が、midx.txt に格納されます。 ◇sort.awk オーム社の本に掲載のマージソートをちょっと改造して、使用しているの で、同等のもの、もしくは、 sort.exe などを用意のうえ、 set sort=sort [opt] のように設定してから、実行してください。 これは、新たに progsort.txt を作るときにだけ、必要です。 ◇fswidx.lzh [5-9].idx フリコレの helper.idx をそれぞれリネームして、まとめて冷凍していま す。つまり、用意して下さい。 5 - 9 のときは、ディスク空容量 450KBぐらい必要。 ディスクに余裕があれば、[5-9].idx をそのままカレントディレクトリに おいてください。すべてカレントディレクトリに置くとすれば、1MBぐら いの空き容量が必要かと・・・ 環境のためのメモリに注意。 このように、バッチファイル中にバッチファイルを書くときには、ラベル に注意しないと誤動作の可能性があるので、注意すること。 この展開例では、空行をファイル終了の印にしているので、可読性などの ためにあきを入れるためには、 rem 文または、 ':',' ' の行であける。 細かいファイルをひとつのファイルにまとめ、管理しやすくなる。また、 必要なときにだけ、展開するので、占有クラスタを少なくすることになる。 バッチファイル中に rem 文でなくドキュメントを書く人は、他にはいな いんだろうな。 calo / pec01662@niftyserve :pshelp type %0.bat :progsortend set idx= set sort=