はじめに

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

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

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