はじめに

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

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

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