これは Google に保存されている http://cd.textfiles.com/fujitsufree/vol11/MS_DOS/TOOL/CONHLP03/PROGSORT.BAT のキャッシュです。 このページは 2009年10月28日 01:08:46 GMT に取得されたものです。 そのため、このページの最新版でない場合があります。 詳細

テキストのみのバージョン
ハイライトされているキーワード: 0 このページへのリンクにだけ含まれているキーワード: batch  
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=