labunix's blog

labunixのラボUnix

■HTML5 レベル1の例題をまとめるワンライナー

■HTML5 レベル1の例題をまとめるワンライナー
 今回は少し丁寧に(?)書きました。

$ BASE="http://html5exam.jp/measures/"; \
  for list in \
    lv1_1.html \
    lv1_2.html \
    lv1_3.html \
    lv1_4.html \
    lv1_5.html;do \
    wget -O - "${BASE}${list}" 2>/dev/null; \
  done | \
  grep "a href=.lv1_" | \
  grep -v "." | \
  sed s%".*a href="%%g | \
  awk -F\" '{print $2}' | \
  for next in `xargs`;do \
    test -f "$next" || w3m -dump ${BASE}${next} > ${next}; \
    # page break \
    for n in `seq 1 80`;do echo -n "-";done;echo; \
    # all line \
    TOTAL=`wc -l ${next} | awk '{print $1}'`; \
    # header \
    HEAD=`nl -ba "${next}" | \
      grep "このエントリーをはてなブックマークに追加" | \
      awk '{if($1>50&&$1<100){print $1}}' | awk '{print $1+0}'`; \
    # footer \
    TAIL=`nl -ba "${next}" | \
      grep "このページの先頭へ" | \
      head -n 1 | awk '{if($1>0){print $1}}' | awk '{print $1+0}'`; \
    # main \
    tail -n "$((${TOTAL}-${HEAD}))" "${next}" | \
      head -n "$((${TAIL}-${HEAD}-3))"
    # for Check \
    echo "TOTAL=${TOTAL},HEAD=${HEAD},TAIL=${TAIL},THIS=$((${TAIL}-${HEAD}-3))" >&2
  done > html5_l1.log
TOTAL=235,HEAD=96,TAIL=134,THIS=35
TOTAL=235,HEAD=96,TAIL=134,THIS=35
TOTAL=239,HEAD=96,TAIL=138,THIS=39
TOTAL=235,HEAD=96,TAIL=134,THIS=35
TOTAL=238,HEAD=96,TAIL=137,THIS=38
TOTAL=247,HEAD=96,TAIL=146,THIS=47
TOTAL=235,HEAD=96,TAIL=134,THIS=35
TOTAL=230,HEAD=96,TAIL=129,THIS=30
TOTAL=246,HEAD=96,TAIL=145,THIS=46
TOTAL=239,HEAD=96,TAIL=138,THIS=39
TOTAL=239,HEAD=96,TAIL=138,THIS=39
TOTAL=245,HEAD=96,TAIL=144,THIS=45
TOTAL=265,HEAD=96,TAIL=164,THIS=65
TOTAL=232,HEAD=96,TAIL=131,THIS=32
TOTAL=232,HEAD=96,TAIL=131,THIS=32
TOTAL=232,HEAD=96,TAIL=131,THIS=32
TOTAL=235,HEAD=96,TAIL=134,THIS=35
TOTAL=234,HEAD=96,TAIL=133,THIS=34
TOTAL=260,HEAD=96,TAIL=159,THIS=60
TOTAL=255,HEAD=96,TAIL=154,THIS=55
TOTAL=237,HEAD=96,TAIL=136,THIS=37
TOTAL=244,HEAD=96,TAIL=143,THIS=44
TOTAL=256,HEAD=96,TAIL=155,THIS=56
TOTAL=233,HEAD=96,TAIL=132,THIS=33
TOTAL=242,HEAD=96,TAIL=141,THIS=42
TOTAL=251,HEAD=96,TAIL=150,THIS=51
TOTAL=248,HEAD=96,TAIL=147,THIS=48
TOTAL=236,HEAD=96,TAIL=135,THIS=36
TOTAL=249,HEAD=96,TAIL=148,THIS=49
TOTAL=246,HEAD=96,TAIL=145,THIS=461280行

$ wc -l html5_l1.log 
1280 html5_l1.log

■30問

$ grep "^\-*\-\$" html5_l1.log | wc -l
30

■問題数以上の重複行は以下。

$ sort html5_l1.log | uniq -c | sort -nr | awk '($1>=30){print}'
    297 
     30 例題解説のご提供者さまを募集中です。LPI-Japan事務局までぜひご投稿ください。選ば
     30 例題解説とその内容については、例題提供者の監修です。内容や試験問題に関わるお問
     30 出題範囲の詳細
     30 れた方の例題解説は本サイトに掲載させていただきます。
     30 い合わせにつきましては、LPI事務局ではお応えできませんのでご了承ください。
     30 ※この例題は実際のHTML5プロフェッショナル認定試験とは異なります。
     30 HTML5プロフェッショナル認定試験レベル1 サンプル問題
     30 --------------------------------------------------------------------------------

■ページ区切りの前後で集計すると、
 初めの行のみ1つ前の行が存在しないので「れた方の~」の行は「-1」となる。

$ grep -2 "^\-*\-\$" html5_l1.log | grep -v "^\-\-\$\|^\$" | sort | uniq -c
     30 --------------------------------------------------------------------------------
     30 HTML5プロフェッショナル認定試験レベル1 サンプル問題
     29 れた方の例題解説は本サイトに掲載させていただきます。