最も大きなRFC

ふとRFCを読んでて思った。
・・・一番大きなRFCはどれなんだろう?


仕事柄、RFC3261 SIP2.0 が最も身近なんですが、まだそれを越えるRFCを見たことがなかったんです。


少しgoogle先生に聞いてみたけど、それらしき情報がすぐには見つからなかったので、IETFrfc index を sed & sort してみることにしました。

 $ wget http://www.ietf.org/iesg/1rfc_index.txt
 --00:57:18--  http://www.ietf.org/iesg/1rfc_index.txt
            => `1rfc_index.txt'
 Resolving www.ietf.org... ***.***.***.***, ****:****:****:****::****
 Connecting to www.ietf.org|***.***.***.***|:80... connected.
 HTTP request sent, awaiting response... 200 OK
 Length: 880,636 (860K) [text/plain]
 
 100%[==============================================>] 880,636  199.09K/s ETA 00:00
 
 00:57:23 (196.84 KB/s) - `1rfc_index.txt' saved [880636/880636]
 
 $ sed ':loop; N; s/\n \+//; t loop; s/[^0-9].\+TXT=/@/; s/[ ,b].\+$//g; s/^[^0-9].\+$//g' 1rfc_index.txt | sort -rn -t '@' -k 2 

さて、結果は?!

 4949@867626
 3261@647976
 3530@600988
 2801@598794
 3720@578468
 2911@575805
 1166@566778
 2626@547560
 1583@532636
 2178@495866
 (・・以下略)

我らがRFC3261は、第2位でした。
そりゃあ、それより大きいRFCを見たことがないわけだよなぁ・・・。orz..

今回の sed コマンド解説

今回少しトリッキーなことをしたので、sedについて調べたことをまとめておきます。
興味がある人だけ読んで下さい。


今回のsedコマンドを分解すると、以下の様になります。

 :loop
 N
 s/\n \+//
 t loop
 s/[^0-9].\+TXT=/@/
 s/[ ,b].\+$//g
 s/^[^0-9].\+$//g

これを、command.sed とかのファイルにしてあげて、以下の様にコマンドを打っても同じ結果が出ます。

 $ sed -f command.sed 1rfc_index.txt | sort -rn -t '@' -k 2


今回の 1rfc_index.txt をじっと眺めると、以下の様な構成になっていました。

 RFC番号 RFCタイトル 著者名 発行日 (Format: TXT=サイズ bytes) 付加情報

今回欲しいのは "RFC番号" と "サイズ" だけなので、それ以外を削除して sort すれば、最大のRFCが見つかることになります。


以下、これを実現する上で紹介した "分解したsedコマンド" の解説です。

  • 1行目 (:loop)
    • 4行目の条件にマッチしたら、この行に戻ってくる様にします
  • 2行目 (N)
    • パターンスペースに次の行を読み込みます
    • この時点で、改行コード(\n)を挟んで2行がパターンスペースに読み込まれることになります
  • 3行目 (s/\n \+//)
    • 1つの改行コード(\n)と、1つ以上の空白文字( \+)が連続してあったら、消去します
  • 4行目 (t loop)
    • 3行目の置換が行われた(t)ら、1行目に戻り(loop)ます
    • ここまでのループで、行の先頭が空白文字から始まっているものは全て前の行と連結されます
  • 5行目 (s/[^0-9].\+TXT=/@/)
    • 数字以外([^0-9])から始まり、任意の個数の文字列の後に、"TXT="で終わる文字列を、"@"で置き換えます
    • これにより、"RFC番号" と "サイズ" の間の文字を全て消し、後でsortするときのセパレータとして"@"を挿入しておくことになります
  • 6行目 (s/[ ,b].\+$//g)
    • "サイズ" の後ろに来る文字列が、空白文字か "," か bytesの "b" だったので、それ以降の行末までの文字を全て消します
  • 7行目 (s/^[^0-9].\+$//g)
    • 行頭が数字で始まらない行(^[^0-9].\+$)を、全て消します

これで後は、sortをして完了です。

気になったこと

  1. なぜか RFC5280 の行だけはうまく処理できずに残ってしまった
    • 原因不明。教えて、偉い人。
  2. 他にも"0"だけの行、"("だけの行、空行が残ってしまった
    • これも原因不明。教えて、偉(以下略)
  3. というか、もっとスマートな方法はないのか?
    • わざわざ sed を使うのが悪い?・・・うーん、ごもっとも
    • その他気づいたことがあったら、なんでもコメント下さい m(_ _)m