はじめに

多量の行が表示されないように、このブログは1コンテンツしか表示されない。ブログアーカイブから、他の記事を捜してくれ。

環境作れし。
・gawk 3.1.5 for Windows をググッて入手。
・gawk.exeをpathの通ったフォルダにぶち込めし。
 (「windows パスを通す」ググッて)
 (面倒なら、C:\windowsにぶち込む)
・環境変数「awkpath」にスクリプトを保存するフォルダを設定。
 (「環境変数 設定 windows」ググッて)
 (面倒なら、C:\windowsに、紹介されているスクリプトぶち込む)

2013年11月10日日曜日

C++ソース解析クラス図作成支援awk script

C++のプロジェクトファイル渡されて、「仕様書無いケド改修シロ」だと??ふざくるな!!

…ってな訳で、クラス図だ。

クラス図って言っても、派生のクラス図じゃないぞ。そんな、閉じたドキュメント、導入タイミングじゃクソの役にもたたん。
欲しいのは関連クラス図。誰が総親で、ドイツがどのオブジェクトのオーナーでライフサイクルはどーなってるかとかの関連を把握すれば、ブラックボックスの特定とかできるジャン。つまり、解析範囲をかなり特定できる訳だ。

クラスにどんなメソッドがあって、「静的、動的、参照、ポインタ」どんな形でオブジェクトの生成をして、どんなメソッドを呼び出しているか、メソッド単位の呼び出し関連一覧を作る。
次に、呼び出し関連一覧を解析して、クラス単位の生成親子関係を調査し、図を描く時に親から数えてどれくらいの深さに在るか、親は誰かを一覧化する。

…あ゛~、概要説明が、これだけ複雑ってことは、スクリプトは解説しようがナイね。

ソース、ヘッダがあるフォルダでallc1.batを起動すれば、c1.tsv(メソッド単位の呼び出し関連一覧)とc3.tsv(クラス親子一覧)を生成する。
後は、両ファイルをExcelで開いてくれ。

※クラスの「静的、動的、参照、ポインタ」とメッソドの記載は、表上でオリジナルな接続詞でつなげてある。推測してくれ。

※親子のレベルは、トップは"0"だけど、子は最下層を"99"として、下位から発番している。

※c1.tsvは、不親切な表だが、メソッドのコードと表の該当行を見比べれば、きっと理解できるはず。

では、グッドラック!

AWKのつぼ

連想配列を多用して、ファイル、クラス、メソッドの辞書や逆引き辞書を作りこんでる。
このスクリプトのリバースする暇があるなら、本来のC++ソースの解析をしてくれ。
その方が不幸度合いが小さい。
あ、c1.awk中にMFC等の変数クラスを除外する除外文字列が4箇所ある。一目で判るぞ。
余分なクラスが出るときは、除外文字に追加してくれ。

allc1.bat


allc1.awk


c1.bat


c1.awk


c2.awk


c3.awk


2013年11月2日土曜日

VBメッソド切り!日本語Regionは使えませんから。残念!なawk script

VBからVB.NETへ移行するとき、イベントの追加等でメソッドのソース上の並び順が変わってしまうんだよな。
動くから問題ないが、差分を出すのが大変だ。
WinMerge等使って差分を出すと、ソースの同期がとれず、差分だらけになってしまう。
そこで、メソッド単位のソース分割だ。

メソッド名、もしくはRegion名毎にソースを分割する。もちろん、その名称をファイル名に使っている。
しかし、分割するソースがUTF-8の為、Region名に日本語を使っていると、作成されるファイル名が化ける。
ま、妥協してくれ。いやなら、nkf32.exeあたりで事前にSJIS化してくれ。

分割したソースをフォルダごとWinMergeに食わせりゃ、OK.。
VB6とVB.NETではメソッド名が変更されたイベントがある。新旧のファイル名をどちらかに合わせてくれ。WinMergeのリスト画面でrenameすると楽だぞ。

ちなみに、コメントアウトしたメソッドも抽出するぞ。親切だろ。

AWKのつぼ

特になし。力技ってヤシだ。

vbcut.bat


vbcut.awk

2013年10月30日水曜日

最強Grep ファイル検索 awk script

Grepコマンドだが、、、

●キーワードに正規表現を使える
●2つめのキーワードを指定して、2つのキーワードにはさまれた行範囲を出力できる
●1つめのキーワード内の部分文字列を2つめのキーワード内に指定できる
●1つめのキーワードに対して除外条件指定できる

例えば、下のC言語のソースファイル"test.c"に最強Grepをかけてみる。

test.c


grep コマンドラインパラメタと出力結果


AWKのつぼ

ま、簡単に説明すると1個目のキーワードマッチでフラグ立てして2個目のキーワードマッチでフラグを落とす。フラゲの時に出力って訳だ。
スクリプト的には難しい所は無い。
しいて言うならば、リアルタイムに、2個目のキーワードの部分文字列指定キャラを本物のその時々の文字列に置き換えて作りこむ所がミソかね。

ptgrep.bat


ptgrep.awk

ptgrep.bat(.awk)は、複数ファイル検索に対応していない。
これを、allptgrep.batで対応する。

allptgrep キーワード1 <拡張子> <ファイル名、キーワード1以外のptgrepパラメタ>

カレントフォルダを基点に階層内の全ファイル中、指定拡張子のファイルに対してptgrepを呼び出すバッチだ。

allptgrep.bat


allptgrep.awk

2013年10月28日月曜日

重複ファイル検索 awk script

指定したパス、もしくはコマンドを実行したカレントパスを階層の基点にして、全フォルダから重複ファイルを検索するスクリプト。
/name /tm /sizeいずれも指定しないと/nameで検索する。

…って、ある意味大作だぞ。

usage:same [/tiny][/tm][/name][/size][/fl <filter regalexp filename>][/fp <filter regalexp fullpath>][/v <avoid fullpath regalexp pattane>] [<path>]
      /tiny 検索結果にタイムスタンプ、サイズを表示しない
      /tm   タイムスタンプが同一のファイルを検索(アンド条件)
      /name ファイル名が同一のファイスを検索(アンド条件)
      /size サイズ名が同一のファイスを検索(アンド条件)
      /fl   ファイル名フィルタ(正規表現)
      /fp   フルパスファイル名フィルタ(正規表現)
      /v    フルパスファイル名除外フィルタ(正規表現)
ex. same /tiny /tm /size /fl "(doc|xls)$" /v "\\(tset|copy)\\" c:\release

c:\release以下のフォルダからdoc及びxlsで終わるファイル名を持つファイルに対し、
サイズ、タイムスタンプが一致するファイルを探しタイニーフォーマットで一覧表示
するが、フルパス中に"\test\"か"\copy\"を持つファイルは除外する。

AWKのつぼ

どこが大作かっつーと、アーギュメント(パラメタ)の処理だ。<path>以外はどんな順番で指定されようがされまいが解析するって所。
後は、まっとうに環境変数 TEMPを取り込んで、そこにワークファイルを作ってる所。
笑える所は、BEGIN処理だけで全処理が完了して、行処理節自体存在してない事だな。

same.bat


dir.awk


2013年10月26日土曜日

C言語解析支援 #ifdef 加工 awk script

例えばコレだ。


…で、こんな感じに加工してくれる



#if 0,#if 1 ~#else~#end節は無効になる行を"//|"のコメントでつぶす、#ifdef節は適用範囲に
"/*@* デファイン名 */"や"/*@* !デファイン名 */"のコメント付加し、適用条件が一目瞭然。
もちろん加工はコンパイル結果に影響しない。
grepをかける前に加工しとけば、不要コードがヒットしても一目で判るぞ。

AWKのつぼ

ごめんな!15年以上昔に書いたスクリプトだ。if条件内のmatchをorで繋げるなんてマヌケのすることだ。"#if[ \t]+0"とか使えって。

ifdef.awk





2013年10月25日金曜日

Excelテキストのセル内改行排除 Awk Script

Excel全シートテキスト保存 Excel macro でも紹介したExcelテキスト…

面倒なことに、コイツはセル内改行があると、Excelシートでの1行がExcelテキスト上で複数行に分断されてしまう。テキストファイルとして見栄えが悪い。

そこで、行の合成だ。

AWKのつぼ

テンプレート化してるから、_BEGIN,_main,_ENDに通常の行処理を書けば、セル内改行を意識しないで動かせる。
ま、ファイル全体一気読み+ファイル全体を配列化などというメモリ無駄食いスクリプトだがな。

tsvsngl.bat


tsvsngl.awk

ちなみに、「1行化して見栄えを良くする」事を考えず、ExcelTextに対して単に行処理をやりたいだけなら、これで十分だが。

tsvxxx.awk

2013年10月23日水曜日

Excel全シートテキスト保存 Excel macro

番外編で Excel Macro VBAだ。

用語辞書作成支援で紹介したAwkScriptだが、食わせる元文書がExcelだと大変。
数十もあるシートをテキスト保存して、Mecabに食わせるなんてウンサリするぞ、
…てなわけで、VBAだ。
ブック名+シート名.tsvというファイル群を一気に生成する。

ただし、内部的には、保存時にブック名と形式がテキストファイルに変わっているから、最後に戻す、、、と言いたい所だが、ブック名と形式を戻す為には、再度保存しないと戻せない。
勝手に元ブックに保存するのはマズいので、元ブック名の先頭に "_" をつけてみる。

ま、後は好きにやってくれ。

WinMergeのExcelアドインはヘボいから、コイツでテキスト保存して、フォルダ単位にWinMerge差分を採る…なんて使い方もあるぞ。
ただし、オブジェクトは無視してるから我慢してくれ。


2013年10月22日火曜日

用語辞書作成支援Awk Script

用語辞書はプロジェクトへの導入等に重要なドキュメントだがこれをgawkだけで作成するには荷が重い。
そこで、コアになる形態素解析にはMecabを使う。Mecabに関しては各自ググってくれ。
gawk側ではMecabが通りやすくする為、フロント処理をする事とMecab出力結果から連名詞の使用頻度を取り出す事だ。

結果として連名詞の使用頻度一覧が出力される。
使用頻度が高い固有名詞は重要な単語で、低い単語は誤字か誤用の可能性が高い。

AWKのつぼ

特になし。Mecab様々だ。

mecabx.bat


ntab.awk


mecab.awk

2013年10月14日月曜日

階層中の空フォルダ削除 Awk Script

かなり昔に作ったヤシだ。

階層ディレクトリの一覧をテンポラリファイルに書き出し、Awkの読み込みファイルと指定し、
その上、スクリプトの中でも別なテンポラリファイルの作成/読み込みをしている。
今書き直すなら、パイプを使うだろな。

しかし、勉強になるポイントもある。

AWKのつぼ

・通常、gawkに与えたコマンドラインパラメタはgawk実行モジュールによって解析される。
余分なパラメタを最後部に追加すると、不正な入力ファイルとして扱われる…
…が、スクリプト中でARGC(パラメタ個数を示すAWKシステム変数)を減算することで、「パラメタがなかった」事にしてのgawkのエラーを回避できる。
つまり、下記のバッチでARGV[2]は%2(delblnk.batの第二パラメタ)で、ARGCは3だが、
ARGC=2と、ARGCを強制することでgawkのエラーなしでパラメタをスクリプトに渡すことが出来る。
ここでは、実削除を行わないためのパラメタ "/n" をスクリプトで受け取っている。

バッチのつぼ
delblnk.awk中system()に渡されているバッチ文字列中の最後尾に注目。
”dir … 2>null"と書かれている。これは、dirコマンドが出力する標準エラー出力をヌルデバイスに書き込み、捨てる指定だ。
画面でdirコマンドを発行すると標準出力、標準エラー出力の混成がスクリーンに表示されるが、エラー表示を排除するときに使用される。

delblnk.bat


delblnk.awk

2013年9月29日日曜日

ファイルをバイナリダンプするAWKScript

なんとgawk3.1.5はバイナリファイルも読み込める
可変長バイナリレコードのログファイルもテキスト化できるわけだ。

ま、バイナリレコードなんて、個別仕様だから、今回はテンプレートとして使ってくれ。

例では、先頭4バイトをリトルエンディアンのlong値、次の2バイトをリトルエンディアンのshort値、残りを16進ダンプで出力している。呼び出していないが、ゾーン10進用の関数もある。
お好みのダンプツールを作ってくれ。

AWKのつぼ

・入力ファイルに変な変換がかからないようにgawk呼び出しパラメタに"--ctype=ASCII"を指定している
・BEGIN節でBINMODE=3,RS=""を指定することで、1行のデータとして全ファイルを読み込んでいる
・AWKはスコープルールがないので、通常、関数内でローカル変数が宣言できない。…が、関数パラメタだけはスタックに積まれるので、その特性を利用し、ローカル変数はその関数のパラメタに、無理やり宣言する。
例えば、function bin(n    ,i,s)は、実際は(n)のみパラメタで受け渡されて、i,sは関数内で使われるローカル変数だ。
これにより、関数の再起呼び出しも可能となる。
・GAWKは連想配列が使える。C#系ではINDEX形と呼ばれているヤシ。
配列の添え字に文字列が使えるので便利だね。内部的にはハッシュテーブルとか使ってるはずだが、プログラマはハッシュを意識しなくてもよい。
ま、ゴミが気になった時には、"delete 配列名"で削除してくれ。今回は定数配列なんで気にしない。

dmp.bat


dmp.awk

フォルダ内不要階層の排除AwkScript

フォルダの中にファイル(フォルダ)が1個だけという無駄な階層を削除する。

つまり
c:\aaa\bbb\ccc\ddd.txt
c:\aaa\bbb\ccc\eee.txt
c:\aaa\fff\ggg.txt
のファイルがあるとき、a:\aaaをカレントパスとしてCMDを開き、
allonefile.batを実行すると
c:\aaa\bbb@ccc\ddd.txt
c:\aaa\bbb@ccc\eee.txt
c:\aaa\fff@ggg.txt
のファイル構成に変更してくれる訳だ。

安全のため、逆に"@"が含まれるファイル(フォルダ)を元に戻すヤシも提供。

unonefile a:\aaa@bbb\ccc@ddd.txt

a:\aaa\bbb\ccc\ddd.txt
に展開してくれる。

注意点:フォルダ内にあるSYSTEM.HIDDN属性のファイルは「存在していない」という認識で動くようにしてある。VisualSourceSafeの展開フォルダとか、気にしたくないからね。

AWKのつぼ

onefile.batの中のawk呼び出しはスクリプトファイルじゃなくて、スクリプトパラメタで記載してる。


allonefile.bat


onefile.bat


unonefile.bat


unonefile.awk

重複フォルダの整理AwkScript

ZIPファイルを解凍すると、ファイル名と同じ名前のフォルダが作成され、その中にまた同じ名前のフォルダが作成される。
本スクリプトは、カレントフォルダを基点にして、同一名のサブフォルダを統合する動作を行う。

つまり
c:\aaa\bbb\bbb\ccc
c:\aaa\ddd\eee\eee\fff
のフォルダがあるとき、a:\aaaをカレントパスとしてCMDを開き、
allfresh.batを実行すると
c:\aaa\bbb\ccc
c:\aaa\ddd\eee\fff
のフォルダ構成に変更してくれる訳だ。
ただし、同一名の親フォルダ配下に同一名フォルダ以外がある場合、統合しない

注意点:カレントドライブの\tempフォルダをワークフォルダとして使うのでカレントのルートが書込み禁止だと動かない。そのときは、バッチを修正してくれ。

AWKのつぼ

AWKはフォルダ内に".","..",同名フォルダの3フォルダのみが存在してるって確認の為だけに使ってる。
後は、その名前を書いたテンポラリファイルと親フォルダ名を書いたテンポラリファイルをFCコマンドでコンペアして、リネーム用動的バッチファイル(temp\fresh3.bat)をキックする。
動的バッチはfresh.batの2行目で動的バッチ作成用バッチ(fresh1.bat)で作成している。
allfresh.batは基点フォルダから再起呼び出しで、全フォルダ毎にfresh.batを呼び出すだけだね。


allfresh.bat


fresh.bat


fresh1.bat


fresh.awk