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
一応複数の出口があれば、全部表示します。(そのほうが楽なので)
出口がひとつしかないとき">"はつかないんじゃないかとか、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
劇的に早くなる
何と比べて?
とりあえず、こんな感じ?
perl -n -e '$first = $1 if /^(\w+)/; printf "%s %s\n", $first, $1 if /^>\s+(\w+)/' < in.txt > out.txt
一応複数の出口があれば、全部表示します。(そのほうが楽なので)
出口がひとつしかないとき">"はつかないんじゃないかとか、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
% 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 |
コメント(8件)
「(スペース)」は見やすく並べるために幾つかのスペースが入っていると思ってください。
network A1(スペース)next hop B1(スペース)その他データ
(スペース)(スペース)next hop B2(スペース)その他データ
>(スペース)(スペース)next hopB3(スペース)その他データ
(スペース)(スペース)next hop B4(スペース)その他データ
network A2(スペース)next hop B5(スペース)その他データ
>(スペース)(スペース)next hop B6(スペース)その他データ
(スペース)(スペース)next hop B7(スペース)その他データ
というデータです。質問するとスペースが詰まってしまって見にくくなってますが。
network A1(スペース)>(スペース)next hop B1(スペース)その他データ
(スペース)(スペース)next hop B2(スペース)その他データ
(スペース)(スペース)next hopB3(スペース)その他データ
(スペース)(スペース)next hop B4(スペース)その他データ
となりますか?
network A1(スペース)>(スペース)next hop B1(スペース)その他データ
(スペース)(スペース)next hop B2(スペース)その他データ
>(スペース)(スペース)next hopB3(スペース)その他データ
(スペース)(スペース)next hop B4(スペース)その他データ
は、ありえますか?
いつもお世話になっております。
>>network A1(スペース)>(スペース)next hop B1(スペース)その他データ
はあります。
>>最短ホップが複数ある場合・・・・
ざっと見た所無かったですが、何しろ300MB以上のテキストファイルなので全部見きれてません。申し訳ありません。
もし最短ホップが複数あった場合を考えると面倒なので、複数あった場合「>」の最上位行のものだけを最短ホップとして扱ってください。
最短ホップが複数あった場合この後の処理が面倒になるので、せめて最短ホップが複数あるかどうか確かめる方法があったら教えてください。
回答ありがとうございます。
あとはgrepすれば分かりますね。