下記のようなデータがあります。ちなみに1列目がネットワーク、2列目がnext hopです。「>」が最短next hopを表しています。すなわち6.14.0.0/15の最短経路は64.57.28.241です。これをネットワークとその最短next hopだけのデータにしたいです。つまり下記のデータを

6.14.0.0/15 64.57.28.241
8.0.0.0/9 74.40.7.35
だけにしたいです。

perlで出来ると思うのですがファイルが300MBを超えるので、劇的に早くなる方法があったら教えてください。


 6.14.0.0/15 195.215.109.254 67768 0 3292 1239 701 668 i
216.218.252.164 0 6939 1299 701 668 i
74.40.7.36 0 0 5650 7018 701 668 i
> 64.57.28.241 0 0 11537 668 i
200.160.127.238 0 27664 3549 701 668 i
202.147.61.12 1 0 10026 3356 701 668 i
8.0.0.0/9 195.215.109.254 7888 0 3292 3356 i
202.76.224.242 0 24218 10026 3356 i
203.124.96.1 0 10075 703 701 3356 i
> 74.40.7.35 0 0 5650 3356 i
207.246.129.13 0 11608 6453 3356 i

回答の条件
  • 1人2回まで
  • 登録:2008/11/19 11:04:53
  • 終了:2008/11/21 11:02:58

ベストアンサー

id:zzz_1980 No.2

zzz_1980回答回数492ベストアンサー獲得回数642008/11/19 14:35:30

ポイント50pt

一応複数の出口があれば、全部表示します。(そのほうが楽なので)

出口がひとつしかないとき">"はつかないんじゃないかとか、destination がネットワークじゃないとうごかないとか、

余計なところで悩みますが…

% cat nexthop.sh
awk 'BEGIN{FMT="%s %s\n";} index($1,"/")!=0{NEXTNET=$1;} ($2==">"){print NEXTNET,$3;}($1==">"){print NEXTNET,$2;}' <$*
% sh nexthop.sh sample.data
6.14.0.0/15 64.57.28.241
8.0.0.0/9 74.40.7.35
8.0.0.10/9 195.215.109.255
8.0.0.10/9 74.40.7.36
% cat sample.data
6.14.0.0/15 195.215.109.254 67768 0 3292 1239 701 668 i
  216.218.252.164 0 6939 1299 701 668 i
  74.40.7.36 0 0 5650 7018 701 668 i
> 64.57.28.241 0 0 11537 668 i
  200.160.127.238 0 27664 3549 701 668 i
  202.147.61.12 1 0 10026 3356 701 668 i
8.0.0.0/9 195.215.109.254 7888 0 3292 3356 i
  202.76.224.242 0 24218 10026 3356 i
  203.124.96.1 0 10075 703 701 3356 i
> 74.40.7.35 0 0 5650 3356 i
  207.246.129.13 0 11608 6453 3356 i
8.0.0.10/9 > 195.215.109.255 7888 0 3292 3356 i
  202.76.224.242 0 24218 10026 3356 i
  203.124.96.1 0 10075 703 701 3356 i
> 74.40.7.36 0 0 5650 3356 i
  207.246.129.13 0 11608 6453 3356 i

その他の回答(3件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402008/11/19 14:01:25

ポイント15pt

劇的に早くなる

何と比べて?


とりあえず、こんな感じ?

perl -n -e '$first = $1 if /^(\w+)/; printf "%s %s\n", $first, $1 if /^>\s+(\w+)/' < in.txt > out.txt
id:zzz_1980 No.2

zzz_1980回答回数492ベストアンサー獲得回数642008/11/19 14:35:30ここでベストアンサー

ポイント50pt

一応複数の出口があれば、全部表示します。(そのほうが楽なので)

出口がひとつしかないとき">"はつかないんじゃないかとか、destination がネットワークじゃないとうごかないとか、

余計なところで悩みますが…

% cat nexthop.sh
awk 'BEGIN{FMT="%s %s\n";} index($1,"/")!=0{NEXTNET=$1;} ($2==">"){print NEXTNET,$3;}($1==">"){print NEXTNET,$2;}' <$*
% sh nexthop.sh sample.data
6.14.0.0/15 64.57.28.241
8.0.0.0/9 74.40.7.35
8.0.0.10/9 195.215.109.255
8.0.0.10/9 74.40.7.36
% cat sample.data
6.14.0.0/15 195.215.109.254 67768 0 3292 1239 701 668 i
  216.218.252.164 0 6939 1299 701 668 i
  74.40.7.36 0 0 5650 7018 701 668 i
> 64.57.28.241 0 0 11537 668 i
  200.160.127.238 0 27664 3549 701 668 i
  202.147.61.12 1 0 10026 3356 701 668 i
8.0.0.0/9 195.215.109.254 7888 0 3292 3356 i
  202.76.224.242 0 24218 10026 3356 i
  203.124.96.1 0 10075 703 701 3356 i
> 74.40.7.35 0 0 5650 3356 i
  207.246.129.13 0 11608 6453 3356 i
8.0.0.10/9 > 195.215.109.255 7888 0 3292 3356 i
  202.76.224.242 0 24218 10026 3356 i
  203.124.96.1 0 10075 703 701 3356 i
> 74.40.7.36 0 0 5650 3356 i
  207.246.129.13 0 11608 6453 3356 i
id:zzz_1980 No.3

zzz_1980回答回数492ベストアンサー獲得回数642008/11/21 09:51:56

ポイント15pt
% cat nexthop.sh
#!/bin/sh
awk 'BEGIN{FMT1="%s %s\n";FMT2="*** %s %s\n";} \
        index($1,"/")!=0{NEXTNET=$1;f=0;} \
        ($2==">"&&f>0){printf FMT2,NEXTNET,$3;f++;} \
        ($2==">"&&f==0){printf FMT1,NEXTNET,$3;f++;} \
        ($1==">"&&f>0){printf FMT2,NEXTNET,$2;f++;}\
        ($1==">"&&f==0){printf FMT1,NEXTNET,$2;f++;}\
        ' <$*

2つ目以降の重複エントリーには頭に***がつきます。

% ./nexthop.sh sample.data
6.14.0.0/15 64.57.28.241
8.0.0.0/9 74.40.7.35
8.0.0.10/9 195.215.109.255
*** 8.0.0.10/9 74.40.7.36

質問者が未読の回答一覧

 回答者回答受取ベストアンサー回答時間
1 goodvn 228 214 18 2008-11-19 12:25:52
  • id:labtest
    質問するとスペース(tab?)が上手く反映されてないみたいだったので補足すると2行目の216.218.252.164にはスペースが幾つか入っていて1行目の195.215.109.254と同じ列に置かれています(縦で見ると並んでいる)。「>」がある行も同様で>の後にスペースが幾つか入っていて64.57.28.241は1行目の195.215.109.254と同じ列に置かれています。
  • id:labtest
    分かりにくい気がしたので再補足します
    「(スペース)」は見やすく並べるために幾つかのスペースが入っていると思ってください。

    network A1(スペース)next hop B1(スペース)その他データ
    (スペース)(スペース)next hop B2(スペース)その他データ
    >(スペース)(スペース)next hopB3(スペース)その他データ
    (スペース)(スペース)next hop B4(スペース)その他データ
    network A2(スペース)next hop B5(スペース)その他データ
    >(スペース)(スペース)next hop B6(スペース)その他データ
    (スペース)(スペース)next hop B7(スペース)その他データ

    というデータです。質問するとスペースが詰まってしまって見にくくなってますが。
  • id:zzz_1980
    B1 が最短ホップになる場合は、
    network A1(スペース)>(スペース)next hop B1(スペース)その他データ
    (スペース)(スペース)next hop B2(スペース)その他データ
    (スペース)(スペース)next hopB3(スペース)その他データ
    (スペース)(スペース)next hop B4(スペース)その他データ
    となりますか?
  • id:zzz_1980
    最短ホップが複数ある場合、たとえば、、
    network A1(スペース)>(スペース)next hop B1(スペース)その他データ
    (スペース)(スペース)next hop B2(スペース)その他データ
    >(スペース)(スペース)next hopB3(スペース)その他データ
    (スペース)(スペース)next hop B4(スペース)その他データ
    は、ありえますか?
  • id:labtest
    >zzz_1980さん

    いつもお世話になっております。

    >>network A1(スペース)>(スペース)next hop B1(スペース)その他データ

    はあります。

    >>最短ホップが複数ある場合・・・・

    ざっと見た所無かったですが、何しろ300MB以上のテキストファイルなので全部見きれてません。申し訳ありません。

    もし最短ホップが複数あった場合を考えると面倒なので、複数あった場合「>」の最上位行のものだけを最短ホップとして扱ってください。
  • id:labtest
    返事が遅れてすみません。

    最短ホップが複数あった場合この後の処理が面倒になるので、せめて最短ホップが複数あるかどうか確かめる方法があったら教えてください。
  • id:zzz_1980
    ちょっと頭がスパゲッティなので明日あらためて。
  • id:labtest
    zzz_1980さん

    回答ありがとうございます。

    あとはgrepすれば分かりますね。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません