Scripting 設計 小考 E


這個資料檔 qD.txt 是用 unzip -v xxx.zip 指令查看一個壓縮檔內容的結果。 請分析這個資料檔, 分別:

  1. 按照年份統計該年度修改的所有檔案壓縮前的大小 (Length 欄位) 總和。 未壓縮的檔案 ("Stored") 不納入統計之列。
  2. 按照副檔名統計該副檔名的所有檔案壓縮前的大小 (Length 欄位) 總和。 未壓縮的檔案 ("Stored") 不納入統計之列。
     penguin:~> ./qE < qE.txt
           45281 00
           26653 01
           96782 02
          734110 03
         1299603 04
           57864 99

            2663 1
           11174 4
            1929 abw
            4335 algotutor
            4273 cgi
             270 crd
            8534 css
           76431 fig
           11920 gr
             962 h
          136819 htm
          191042 html
          108449 jpg
             244 oss
           21119 pdf
          127775 php
             303 phtml
           26032 pl
          117484 pm
          239855 png
            2558 ps
          677886 shtml
             307 svg
           78717 txt
            3252 xml

提示:

  1. 一次寫一點; 加一小個功能就測試一下; 無妨多印一些中間計算過程/除錯資訊。
  2. 把這兩句貼到你的迴圈內, 可以跳過不相關的資料列, 以免產生警告訊息:
            my ($length, $method, undef, undef, $date, undef, undef, $name) = split " ", $_;
            next unless defined $name and $length =~ /^\d+$/;
    
  3. 如果要搜尋的字串裡面含有 . 應寫成 \. 若含有 / 應寫成 \/
  4. 不需要排序。 不過要排序也很簡單: 用 sort 函數。
  5. 印出來的數字不需要對齊。 不過要對齊也很簡單: printf "%8d %-1s\n", 數字, 字串;

建議每增加一點功能, 就測試一下, 就交上來; 不要一口氣寫很多再測試。 (除非你跟我一樣熟悉 perl)

  1. 讀一列, 印一列
  2. 跳過不相關的資料列, 且拆開每一列並印出 Length, Method, Date, Name 四個欄位。
  3. 跳過「未壓縮檔案」的資料列 ("Stored")
  4. Date 部分, 改只印年份
  5. 用 hash 統計並印出 「按照年份統計」 的結果
  6. Name 部分, 改只印副檔名。 提示: 以 "." 為分隔號, 拆開後的最後一個欄位, "大約" 就是副檔名。 例如 public_html/p/algotutor-0.6/doc/gen_at_graph.1.html 用 "." 拆開後, 不只兩段。
  7. 若沒有副檔名 (例如 public_html/l/mr/LDP), 或是副檔名內有 "/" (例如 public_html/p/algotutor-0.4/Math/Makefile) 這些都不應納入統計
  8. 用 hash 統計並印出 「按照副檔名統計」 的結果