Awkことはじめ

written by がいすと

6.5 フォルダ検査の結果とまとめ

以上の前提をふまえて、dirコマンドの結果のなかからファイル情報を抽出、並べ替えして出力するプログラムを作成しましょう。最初の出力では、ファイルがスペースで区切られていたため、少し複雑なプログラムになってしまいました。この後の処理を楽にするため、出力するファイルでは項目をスペースではなくコロンで区切るようにします。そのためには、出力の区切りを指定する変数OFSを変更すればいいのです。

最終的な結果のプログラムを示します。


[scandir1.awk]

BEGIN{OFS=":"} #出力の区切りをコロンにする
NF>=5 && $0 !~ /<DIR>/{
    if ($4 ~ /[0-9][0-9]-[0-1][0-9]-[0-3][0-9]/) #第4項は日付?
        i = 6      #拡張子あればファイル名は第6項から
    else
        i = 5;     #拡張子なければ第5項から
    gsub("-","",$(i-2)); #日付からハイフンを除去
    gsub(":","",$(i-1)); #時刻からコロンを除去
    j = i;               #iをjにコピー(ファイル名の先頭の項目数)
    fname = $j;          #最初の単語
    while(++j<=NF){fname=fname " " $j} #追加の単語を後ろに追加
    print fname,$(i-2),$(i-1);
}

結果は以下のようになります。


Dt0304e1.mid:990227:131
Zephyr Project Web Page.htm:990911:1411
C,C++.htm:991003:2321
Test:991011:1911
Test.256:991011:1915

この処理を比較したい二つのフォルダでやります。簡便のため、バッチファイルscan.batを作っておきましょう。


[scan.bat]
dir %1 > dir1.tmp
dir %2 > dir2.tmp
gawk -f scandir1.awk dir1.tmp > scan1.tmp
gawk -f scandir1.awk dir2.tmp > scan2.tmp

たとえば、docフォルダとtmpフォルダを処理したい場合は、以下のようにします:


scan doc tmp

これを実行すると、両フォルダの中身を加工したものがscan1.tmpとscan2.tmpに格納されます。

付記

お気づきの方もいるでしょうが、このプログラム、2000年問題非対応です(笑)。 1999年の記事なのになあ。解決策は色々とあるのでしょうが、ここでは簡易的に2049年問題に先送りにする方法でお茶を濁すことにします。この姿勢が2000年問題を生んだことを考えるとちっとも過去に学んでいないのですが・・・出力の前にこの部分を入れておきます。これで00〜99を1950〜2049年と解釈することが出来ます。


if ($(i-1) < 50)
    $(i-1)=$(i-1)+2000
else
    $(i-1)=$(i-1)+1900;